最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c# 面試必備線程基礎(chǔ)知識點(diǎn)

 更新時間:2020年11月10日 11:10:17   作者:精致碼農(nóng) • 王亮  
這篇文章主要介紹了c# 面試必備線程基礎(chǔ)知識點(diǎn),幫助大家更好的鞏固,掌握線程的基礎(chǔ)知識,感興趣的朋友可以了解下

線程的知識太多,知識點(diǎn)有深有淺,往深的研究會涉及操作系統(tǒng)、CPU、內(nèi)存,往淺了說就是一些語法。沒有一定的知識積累,很難把線程的知識寫得全面,當(dāng)然我也沒有這個能力。所以想到一個點(diǎn)寫一個點(diǎn),盡量總結(jié)一些有用的知識點(diǎn)。線程是個大話題,這個系列可能會有好幾遍關(guān)于線程的,先從基礎(chǔ)的開始,熱熱身。

一些基礎(chǔ)概念

線程(Thread)是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。它是進(jìn)程中的實(shí)際運(yùn)作單位,一個進(jìn)程中可以啟動多個線程,每個線程可以并行執(zhí)行不同的任務(wù)。嚴(yán)格意義上來說,同一時間可以并行運(yùn)行的線程數(shù)取決于 CPU 的核數(shù)。

根據(jù)線程運(yùn)行模式,可以把線程分為前臺線程、后臺線程和守護(hù)(Daemon)線程:

  • 前臺線程:主程序必須等待線程執(zhí)行完畢后才可退出程序。C# 中的 Thread 默認(rèn)為前臺線程,也可以設(shè)置為后臺線程。
  • 后臺線程:主程序執(zhí)行完畢立即跟隨退出,不管線程是否執(zhí)行完畢。C# 的 ThreadPool 管理的線程默認(rèn)為后臺線程。
  • 守護(hù)線程:守護(hù)線程擁有自動結(jié)束自己生命周期的特點(diǎn),它通常被用來執(zhí)行一些后臺任務(wù)。

每次開啟一個新的線程都要消耗一定的內(nèi)存,即使線程什么也不做,也會至少消耗 1M 左右的內(nèi)存。

多線程并行(Parallelism)和并發(fā)(Concurrency)的區(qū)別:

  • 并行:同一時刻有多條指令在多個處理器上同時執(zhí)行,無論從宏觀還是微觀上都是同時發(fā)生的。
  • 并發(fā):是指在同一時間段內(nèi),宏觀上看多個指令看起來是同時執(zhí)行,微觀上看是多個指令進(jìn)程在快速的切換執(zhí)行,同一時刻可能只有一條指令被執(zhí)行。

PS:以上概念來源 Google 的多個搜索結(jié)果,稍加整理。

Thread、ThreadPool 和 Task

對 C# 開發(fā)者來說,不可不理解清楚 Thread、ThreadPool 和 Task 這三個概念。這也是面試頻率很高的話題,在 StackOverflow 可以找到有很多不錯的回答,我總結(jié)整理了一下。

Thread

Thread 是一個實(shí)際的操作系統(tǒng)級別的線程(OS 線程),有自己的棧和內(nèi)核資源。Thread 允許最高程度的控制,你可以 Abort、Suspend 或 Resume 一個線程,你還可以監(jiān)聽它的狀態(tài),設(shè)置它的堆棧大小和 Culture 等屬性。Thread 的開銷成本很高,你的每一個線程都會為它的堆棧消耗相對較多的內(nèi)存,并且在線程之間的處理器上下文切換時會增加額外的 CPU 開銷。

ThreadPool

ThreadPool(線程池)是一堆線程的包裝器,由 CLR 維護(hù)。你對線程池中的線程沒有任何控制權(quán),你甚至無法知道線程池什么時候開始執(zhí)行你提交的任務(wù),你只能控制線程池的大小。簡單來說,線程池調(diào)用線程的機(jī)制是,它首先調(diào)用已創(chuàng)建的空閑線程來執(zhí)行你的任務(wù),如果當(dāng)前沒有空閑線程,可能會創(chuàng)建新線程,也可能會等待。

使用 ThreadPool 可以避免創(chuàng)建太多線程的開銷。但是,如果你向 ThreadPool 提交了太多長時間運(yùn)行的任務(wù),它可能會被填滿,這時你提交的后面的任務(wù)可能最終會等待前面的長時間運(yùn)行的任務(wù)執(zhí)行完成。此外,線程池沒有提供任何方法來檢測一個工作任務(wù)何時完成(不像 Thread.Join()),也沒有方法來獲取結(jié)果。因此,ThreadPool 最好用于調(diào)用者不需要結(jié)果的短時操作。

Task

Task 是 TPL(Task Parallel Library)提供一個類,它在 Thread 和 TheadPool 之間提供了兩全其美的解決方案。和 ThreadPool 一樣,Task 并不創(chuàng)建自己的OS 線程。相反,Task 是由 TaskScheduler 調(diào)度器執(zhí)行的,默認(rèn)的調(diào)度器只是在 ThreadPool 上運(yùn)行。

與 ThreadPool 不同的是,Task 還允許你知道它完成的時間,并獲取返回一個結(jié)果。你可以在現(xiàn)有的 Task 上調(diào)用 ContinueWith(),使它在任務(wù)完成后運(yùn)行更多的代碼(如果它已經(jīng)完成,就會立即運(yùn)行回調(diào))。

你也可以通過調(diào)用 Wait() 來同步等待一個任務(wù)的完成(或者,通過獲取它的 Result 屬性)。與 Thread.Join() 一樣,這將阻塞調(diào)用線程,直到任務(wù)完成。通常不建議同步等待任務(wù)執(zhí)行完成,它使調(diào)用線程無法進(jìn)行任何其他工作。如果當(dāng)前線程要等待其它線程任務(wù)執(zhí)行完成,建議使用 async/await 異步等待,這樣當(dāng)前線程可以空閑出來去處理其它任務(wù),比如在 await Task.Delay() 時,并不占用線程資源。

由于任務(wù)仍然在 ThreadPool 上運(yùn)行,因此不應(yīng)該將其用于長時任務(wù)的執(zhí)行,因?yàn)樗鼈儠顫M線程池并阻塞新的工作任務(wù)。相反,Task 提供了一個 LongRunning 選項(xiàng),它將告訴 TaskScheduler 啟用一個新的線程,而不是在 ThreadPool 上運(yùn)行。

所有較新的上層多線程 API,包括 Parallel.ForEach()、PLINQ、async/await 等,都是建立在 Task 上的。

Thread 和 Task 簡單示例

下面通過一個簡單示例演示 Thread 和 Task 的使用,注意他們是如何創(chuàng)建、傳參、執(zhí)行和等待執(zhí)行完成的。

static void Main(string[] args)
{
  // 創(chuàng)建兩個新的 Thread
  var thread1 = new Thread(new ThreadStart(() => PerformAction("Thread", 1)));
  var thread2 = new Thread(new ThreadStart(() => PerformAction("Thread", 2)));

  // 開始執(zhí)行線程任務(wù)
  thread1.Start();
  thread2.Start();

  // 等待兩個線程執(zhí)行完成
  thread1.Join();
  thread1.Join();

  Console.WriteLine("Theads done!");

  Console.WriteLine("===我是分隔線===");

  // 創(chuàng)建兩個新的 Task
  var task1 = Task.Run(() => PerformAction("Task", 1));
  var task2 = Task.Run(() => PerformAction("Task", 2));

  // 執(zhí)行并等待兩個 Task 執(zhí)行完成
  Task.WaitAll(new[] { task1, task2 });

  Console.WriteLine("Tasks done!");

  Console.ReadKey();
}

static void PerformAction(string threadOrTask, int id)
{
  var rnd = new Random(id);
  for (int i = 0; i < 5; i++)
  {
    Console.WriteLine($"{threadOrTask}: {id}: {i}", id, i);
    Thread.Sleep(rnd.Next(0, 1000));
  }
}

運(yùn)行效果:

注意到,相比之下 Task 比 Thread 好用得多,加上前文 Task 和 Thread 的對比,對我們編碼的指導(dǎo)意義是:大多數(shù)情況我們應(yīng)該使用 Task,而不要直接使用 Thread,除非你明確知道你需要一個獨(dú)立的線程來執(zhí)行一個長耗時的任務(wù)。

小結(jié)

本篇內(nèi)容很基礎(chǔ),整理了 C# 線程編程有關(guān)的重要概念,簡單演示了 Thread 和 Task 的使用。Thread 和 Task 是高頻面試話題,尤其是 Thread 和 Task 的區(qū)別,Thread 更底層,Task 更抽象,回答好這類面試題的關(guān)鍵點(diǎn)在 ThreadPool。

作者:精致碼農(nóng)

出處:http://cnblogs.com/willick

以上就是c# 面試必備線程基礎(chǔ)知識點(diǎn)的詳細(xì)內(nèi)容,更多關(guān)于c# 線程基礎(chǔ)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#實(shí)現(xiàn)根據(jù)年份計(jì)算生肖屬相的方法

    C#實(shí)現(xiàn)根據(jù)年份計(jì)算生肖屬相的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)根據(jù)年份計(jì)算生肖屬相的方法,涉及C#數(shù)組與字符串的操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • C# 創(chuàng)建,讀取,寫入XML文件

    C# 創(chuàng)建,讀取,寫入XML文件

    本篇文章主要介紹了C# 創(chuàng)建,讀取,寫入XML文件的方法,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • 深入理解C♯ 7.0中的Tuple特性

    深入理解C♯ 7.0中的Tuple特性

    這篇文章主要介紹了C#7中Tuple特性的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),相信對大家具有一定的參考價值,需要的朋友可以們下面來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-03-03
  • C#中async和await的深入分析

    C#中async和await的深入分析

    Async/Await是C# 5引入的關(guān)鍵字,用以提高用戶界面響應(yīng)能力和對Web資源的訪問能力,同時它使異步代碼的編寫變得更加容易,下面這篇文章主要給大家介紹了關(guān)于C#中async和await的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • C#字節(jié)數(shù)組(byte[])和字符串相互轉(zhuǎn)換方式

    C#字節(jié)數(shù)組(byte[])和字符串相互轉(zhuǎn)換方式

    這篇文章主要介紹了C#字節(jié)數(shù)組(byte[])和字符串相互轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C#使用RestSharp實(shí)現(xiàn)封裝常用的http請求方法

    C#使用RestSharp實(shí)現(xiàn)封裝常用的http請求方法

    這篇文章主要為大家詳細(xì)介紹了C#如何使用RestSharp實(shí)現(xiàn)封裝常用的http請求方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2024-02-02
  • 最好用的WPF加載動畫功能

    最好用的WPF加載動畫功能

    當(dāng)開發(fā)應(yīng)用程序時,提供良好的用戶體驗(yàn)(UX)是至關(guān)重要的,加載動畫作為一種有效的溝通工具,它不僅能告知用戶系統(tǒng)正在工作,還能夠通過視覺上的吸引力來增強(qiáng)整體用戶體驗(yàn),本文給大家介紹了最好用的WPF加載動畫功能,需要的朋友可以參考下
    2025-01-01
  • C# 中使用正則表達(dá)式匹配字符的含義

    C# 中使用正則表達(dá)式匹配字符的含義

    正則表達(dá)式的作用用來描述字符串的特征。本文重點(diǎn)給大家介紹C# 中使用正則表達(dá)式匹配字符的含義,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-10-10
  • C#實(shí)現(xiàn)ListView選中項(xiàng)向上或向下移動的方法

    C#實(shí)現(xiàn)ListView選中項(xiàng)向上或向下移動的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)ListView選中項(xiàng)向上或向下移動的方法,通過兩個按鈕點(diǎn)擊事件實(shí)現(xiàn)ListView選中項(xiàng)的上下移動功能,需要的朋友可以參考下
    2015-06-06
  • 在C#中獲取端口號與系統(tǒng)信息的高效實(shí)踐

    在C#中獲取端口號與系統(tǒng)信息的高效實(shí)踐

    在現(xiàn)代軟件開發(fā)中,尤其是系統(tǒng)管理、運(yùn)維、監(jiān)控和性能優(yōu)化等場景中,了解計(jì)算機(jī)硬件和網(wǎng)絡(luò)的狀態(tài)至關(guān)重要,C# 作為一種廣泛應(yīng)用的編程語言,提供了豐富的 API 來幫助開發(fā)者獲取計(jì)算機(jī)的硬件信息和網(wǎng)絡(luò)狀態(tài),本篇博客將帶你深入探索如何在 C# 中高效獲取端口號和系統(tǒng)信息
    2025-01-01

最新評論

晋宁县| 丽水市| 长丰县| 钦州市| 昌平区| 伊通| 姚安县| 兴化市| 应用必备| 淄博市| 昆山市| 鄂温| 邛崃市| 广昌县| 永清县| 富民县| 綦江县| 长海县| 云龙县| 黄浦区| 琼结县| 江都市| 凯里市| 湖南省| 阜宁县| 云龙县| 梅河口市| 丘北县| 本溪市| 沂源县| 贵港市| 新平| 宝清县| 新乡县| 井陉县| 望奎县| 岑溪市| 任丘市| 云阳县| 南部县| 子长县|