2023年全國(guó)碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩43頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第 10 章齊頭并進(jìn)完成任務(wù)——多線程操作,多線程和多線程的實(shí)現(xiàn) 線程間數(shù)據(jù)同步 帶參數(shù)的線程線程池,第 10 章齊頭并進(jìn)完成任務(wù)——多線程操作,多線程和多線程的實(shí)現(xiàn) 線程間數(shù)據(jù)同步 帶參數(shù)的線程線程池,10.1 多管齊下--多線程和多線程的實(shí)現(xiàn),多任務(wù)是在同一時(shí)間內(nèi)執(zhí)行多個(gè)任務(wù),在軟件開發(fā)的過程中,使用多線程技術(shù),可以提高程序的用戶滿意度,可以把占據(jù)長(zhǎng)時(shí)間的程序中的任務(wù)放到后臺(tái)去處理,目前在桌面系統(tǒng)占主流的操作系統(tǒng)W

2、indows系列,就是多任務(wù)體系的典型代表,或者當(dāng)用戶點(diǎn)擊了一個(gè)按鈕去觸發(fā)按鈕的單擊事件,可以彈出一個(gè)進(jìn)度條來顯示處理的進(jìn)度,而不至使用戶誤會(huì)當(dāng)前任務(wù)的狀態(tài)。,10.1.1 線程的概念,在談?wù)摼€程之前,首先要了解進(jìn)程。什么是進(jìn)程呢?進(jìn)程為應(yīng)用程序的運(yùn)行實(shí)例,是應(yīng)用程序的一次動(dòng)態(tài)執(zhí)行。,,一個(gè)進(jìn)程是由多個(gè)線程所組成的,線程是程序執(zhí)行的基本原子單位,一個(gè)進(jìn)程可以由多個(gè)線程組成。線程是“進(jìn)程”中某個(gè)單一順序的控制流。線程是進(jìn)程中的一個(gè)基本執(zhí)

3、行流,每個(gè)線程都有自己專屬的寄存器(程序計(jì)數(shù)器、棧指針等),代碼區(qū)共享,不同的線程可以執(zhí)行同樣的函數(shù)。,,我們現(xiàn)在可以坐在電腦旁邊,邊操作計(jì)算機(jī)使用媒體播放器播放mp3,邊使用PowerPoint,而這些任務(wù)之間絲毫不會(huì)相互干擾,這些都得益于多線程帶來的好處。多線程可以實(shí)現(xiàn)并行處理,避免了某項(xiàng)任務(wù)長(zhǎng)時(shí)間占用CPU時(shí)間。要注意的是,多線程程序?qū)τ谛蕬?yīng)該根據(jù)任務(wù)不同的要求來選擇:如果兩個(gè)非?;钴S的線程為了搶奪對(duì)CPU的控制權(quán),在線程

4、切換時(shí)會(huì)消耗的CPU資源,反而會(huì)降低系統(tǒng)的性能。,10.1.2 線程執(zhí)行函數(shù),在線程的相關(guān)知識(shí)中,Thread類是最重要的一個(gè),所有起步的信息都包含在Thread類中。Thread類提供了創(chuàng)建并控制線程,設(shè)置其優(yōu)先級(jí)并獲取其狀態(tài)的方法。該類包含在System.Threading命名空間中。如果你想在你的應(yīng)用程序中使用多線程,就必須包含Thread類,而在使用Thread類之前,您的程序一定要使用如下語句,把System.Thread

5、ing命名空間包含進(jìn)來: using System.Threading;,,Thread類中擁有4個(gè)重載的構(gòu)造函數(shù),使用最為廣泛的是:public Thread( ThreadStart start)參數(shù):start 參數(shù)類型:System.Threading ThreadStart ThreadStart委托,它表示此線程開始執(zhí)行時(shí)要調(diào)用的方法。 需要注意的是,ThreadStart是一個(gè)委托,在創(chuàng)

6、建線程時(shí),在該線程上執(zhí)行的方法將通過一個(gè)傳遞給 Thread構(gòu)造函數(shù)的 ThreadStart 委托來表示。在調(diào)用 Start 方法之前,該線程不會(huì)開始執(zhí)行。,下面我們舉個(gè)例子來說明Thread的聲明。,01 //C#中的線程演示02 class ThreadSimple//定義類03 {04 //靜態(tài)線程函數(shù)05 public static void ThreadMethodExample(){06

7、}07 //調(diào)用靜態(tài)方法08 Thread ThreadSimple = new Thread (ThreadSimple .ThreadMethodExample)在這個(gè)實(shí)例中,創(chuàng)建了一個(gè)線程對(duì)象ThreadSimple,并且清楚的告訴了我們靜態(tài)線程函數(shù)的使用。在實(shí)際的代碼編寫時(shí),還可以使用更簡(jiǎn)單的線程定義方式:,,01 Thread ThreadSimple = new Thread(new ThreadSta

8、rt(ThreadMethodExample));很多人都認(rèn)為第一種方式有點(diǎn)復(fù)雜,而愿意采用第二種更簡(jiǎn)單的方式定義線程,兩種方式的效果是完全一樣,第二種方式寫出的程序更簡(jiǎn)潔。,10.1.3 啟動(dòng)線程,現(xiàn)在我們有了一個(gè)線程,如何啟動(dòng)這個(gè)線程呢?在Thread中提供了Start方法,通過調(diào)用該方法,可以啟動(dòng)線程。Thread.Start方法啟動(dòng)線程:即新建并啟動(dòng)一個(gè)線程的代碼如下。ThreadSimple.Start();,

9、在Thread這個(gè)類以對(duì)象的方式提供一些必要的實(shí)例成員,其中下面這些是比較常用的:,⑴ IsAlive:判斷線程是否處于活動(dòng)狀態(tài)。⑵ Name:線程的名稱。⑶ Priority:ThreadPriority枚舉類型,代表線程的優(yōu)先級(jí)。⑷ ThreadState:ThreadState枚舉類型,代表線程的狀態(tài)。⑸ Start:?jiǎn)?dòng)一個(gè)線程。⑹ Suspend:掛起一個(gè)線程的運(yùn)行。⑺ Resume:繼續(xù)掛起的線程。⑻ Abor

10、t:結(jié)束一個(gè)線程的運(yùn)行。,當(dāng)線程創(chuàng)建完畢之后并啟動(dòng)之后,控制線程的工作還有以下幾件事需要完成:,線程的優(yōu)先級(jí):ThreadPriority屬性用于設(shè)置線程的級(jí)別。在枚舉類型ThreadPriorit中定義了以下成員,分別對(duì)應(yīng)一種線程級(jí)別。Normal:普通級(jí)別。AboveNormal:高于普通級(jí)別。BelowNormal:低于普通級(jí)別。Highest:最高級(jí)別。Lowest:最低級(jí)別。,,下面的語句把線程的級(jí)別設(shè)成了最高。

11、 ThreadSimple.priority = ThreadPriority.Highest;⑵ 線程的休眠:休眠線程是讓進(jìn)程進(jìn)入一定時(shí)間的休眠狀態(tài),時(shí)間一到,線程將繼續(xù)運(yùn)行。這可以通過Thread的Sleep方法實(shí)現(xiàn)。Thread類中有兩個(gè)重載的Sleep方法,一個(gè)帶有int類型的參數(shù),指定休眠的毫秒數(shù),另一個(gè)帶有TimeSpan類型的參數(shù),指定休眠的時(shí)間段。,例如,下面兩個(gè)Sleep調(diào)用效果是相同的,都是休眠10秒鐘,0

12、1 Thread.Sleep(10000);02 Thread.Sleep(New TimeSpan(0, 0, 0, 0, 10000));⑸ 線程的掛起:和休眠不同,線程的掛起是暫停線程,如果不再啟動(dòng)線程,它將永遠(yuǎn)保持暫停狀態(tài)。只有當(dāng)前運(yùn)行的線程才可以掛起,對(duì)已經(jīng)掛起的線程實(shí)施掛起操作沒有任何效果。代碼如下。01 //如果線程的狀態(tài)是運(yùn)行02 if (NewThread.ThreadState = = T

13、hreadState.Running)03 {04 //線程掛起05 NewThread.Suspend();06 },,這里通過查詢Thread的ThreadState屬性檢查線程是否在運(yùn)行。⑹ 線程的繼續(xù):掛起線程可以使用Thread.Resume方法繼續(xù)運(yùn)行。對(duì)沒有掛起的線程使用繼續(xù)操作將沒有任何結(jié)果。代碼如下。01 //如果線程的狀態(tài)是掛起02 if (NewThread.ThreadSt

14、ate = ThreadState.Suspended)03 {04 //線程繼續(xù)05 NewThread.Resume();06 },【拓展訓(xùn)練】 在C#中輸出線程的名字,剛才,我們學(xué)習(xí)了線程中的實(shí)例成員,怎么用呢?我能否給線程命名,并且輸出線程的名字呢?這個(gè)是完全可以做到的,用上面給出的實(shí)例方法寫成如下代碼就可做到:,10.1.4 結(jié)束線程,在C#中,System.Threading命名空間提供一些使得可

15、以進(jìn)行多線程編程的類和接口。除同步線程活動(dòng)和數(shù)據(jù)訪問的類之外,此命名空間還包含一個(gè) ThreadPool類,它使用戶能夠使用系統(tǒng)提供的線程池和一個(gè) Timer類,在線程池線程上執(zhí)行回調(diào)方法。Thread類有幾個(gè)重要的方法,描述如下:Abort():調(diào)用此方法通常會(huì)終止線程。在調(diào)用此方法的線程上引發(fā) ThreadAbortException,以開始終止此線程的過程。Sleep(int):已重載。 將當(dāng)前線程阻塞指定的毫秒數(shù)。該方法是

16、靜態(tài)方法,,Suspend():該方法并不終止未完成的線程,它僅僅掛起線程,以后還可恢復(fù)。 Resume():恢復(fù)被Suspend()方法掛起的線程的執(zhí)行 。 現(xiàn)在我們動(dòng)手編寫一個(gè)完整線程操作的例子,從創(chuàng)建線程,運(yùn)行線程,終止線程的全程操作。,【范例10-1】 C#中的線程程序,在這段程序中為了對(duì)我們已經(jīng)學(xué)習(xí)到的知識(shí)進(jìn)行擴(kuò)展,程序中還有意的使用了Thread.ThreadState屬性,這個(gè)屬性代表了線程運(yùn)行時(shí)狀態(tài),指示

17、當(dāng)前線程的狀態(tài)的枚舉值之一,ThreadState 為線程定義了一組所有可能的執(zhí)行狀態(tài)。一旦線程被創(chuàng)建,它就至少處于其中一個(gè)狀態(tài)中,直到終止。在公共語言運(yùn)行時(shí)中創(chuàng)建的線程最初處于 Unstarted狀態(tài),而進(jìn)入運(yùn)行時(shí)的外部線程則已經(jīng)處于 Running 狀態(tài)。通過調(diào)用 Start 方法可以將 Unstarted 線程轉(zhuǎn)換為 Running 狀態(tài)。并非所有的 ThreadState 值的組合都是有效的;例如,線程不能同時(shí)處于 Aborte

18、d 和 Unstarted 狀態(tài)中。 ThreadState在各種情況下的可能取值如下:,,第 10 章齊頭并進(jìn)完成任務(wù)——多線程操作,多線程和多線程的實(shí)現(xiàn) 線程間數(shù)據(jù)同步 帶參數(shù)的線程線程池,10.2 合理利用資源--線程間數(shù)據(jù)同步,通過上面的學(xué)習(xí),對(duì)于線程我們已經(jīng)有了一個(gè)簡(jiǎn)單的印象,已經(jīng)可以簡(jiǎn)單的操作一個(gè)線程了,但是在當(dāng)一個(gè)程序存在多個(gè)線程時(shí),其間的線程間數(shù)據(jù)同步問題有隨之而來。我們?cè)谶@個(gè)章節(jié)中,將探討如何解決這個(gè)問題。,

19、10.2.1 線程間數(shù)據(jù)共享,在多線程編程中,如果線程間需要共享數(shù)據(jù),需要的操作是把要共享的數(shù)據(jù)設(shè)置成靜態(tài)類型的,使用關(guān)鍵字static,比如,我們需要共享ShareDateInt這個(gè)整形變量,則在程序中按照下面的方法就可以: static int ShareDateInt = 0;上面的語句聲明一個(gè)靜態(tài)整形變量ShareDateInt。,然后我們創(chuàng)建多個(gè)線程: 01 ShareData ShareDdataC;//

20、聲明ShareData對(duì)象ShareDdataC02 Thread[] ThreadArray;//聲明線程數(shù)組03 ThreadArray = new Thread[5];//創(chuàng)建線程數(shù)組04 ShareDdataC = new ShareData();//構(gòu)造ShareDdataC對(duì)象05 for (int i = 0; i < 5; ++i)//使用循環(huán)的方式創(chuàng)建多個(gè)線程06

21、 {07 ThreadArray[i] = new Thread(new ThreadStart(ShareDdataC.ThreadFunc));08 ThreadArray[i].Start();//線程運(yùn)行09 Thread.Sleep(500);//主線程睡眠10 },10.2.2 lock語句同步數(shù)據(jù)訪問,在編程中,我們會(huì)遇到同時(shí)需要對(duì)某個(gè)

22、數(shù)據(jù)進(jìn)行操作的情況,如果我們?cè)诔绦蛑行枰幚磉@樣的情況,兩個(gè)線程需要同時(shí)操作一個(gè)隊(duì)列,一個(gè)線程進(jìn)行添加操作,另外一個(gè)線程進(jìn)行取用元素操作,這是一個(gè)典型的生產(chǎn)者和消費(fèi)者問題,添加元素的線程為生產(chǎn)者,取用元素的線程為消費(fèi)者。這個(gè)問題是多線程應(yīng)用中一個(gè)必須解決的問題,這個(gè)問題涉及到線程之間更深層次的操作:線程之間的同步和通訊處理。 這些操作我們以前往往不能很好的進(jìn)行處理,自從C#語言中引入了lock這個(gè)關(guān)鍵字,以上問題就比較容易予以解決了。

23、 lock 關(guān)鍵字將語句塊標(biāo)記為臨界區(qū),方法是獲取給定對(duì)象的互斥鎖,執(zhí)行語句,然后釋放該鎖。此語句的形式如下:,Lock語句的語法規(guī)則:,lock(expression) statement_block其中,expression是加鎖對(duì)象,必須是引用類型,不能是數(shù)值類型;statement_block代表正在訪問共享資源的程序段。下面就是一段對(duì)lock使用的演示代碼: 【范例10-2】 創(chuàng)建程序,熟悉線程中的lock語句的用法

24、,10.2.3 Mutex類同步數(shù)據(jù)訪問,當(dāng)兩個(gè)或更多線程需要同時(shí)訪問一個(gè)共享資源時(shí),系統(tǒng)需要使用同步機(jī)制來確保一次只有一個(gè)線程使用該資源。Mutex類就是.net給我們提供一個(gè)非常有幫助的類,它只向一個(gè)線程授予對(duì)共享資源的獨(dú)占訪問權(quán)。如果一個(gè)線程獲取了互斥體,則要獲取該互斥體的第二個(gè)線程將被掛起,直到第一個(gè)線程釋放該互斥體。在Mutex類中有三個(gè)關(guān)鍵的方法:,,可以使用 WaitHandle.WaitOne 方法請(qǐng)求互斥體的所屬權(quán)。

25、擁有互斥體的線程可以在對(duì) WaitOne的重復(fù)調(diào)用中請(qǐng)求相同的互斥體而不會(huì)阻止其執(zhí)行。但線程必須調(diào)用 ReleaseMutex 方法同樣多的次數(shù)以釋放互斥體的所屬權(quán)。 線程使用Mutex.WaitOne()方法等待Mutex對(duì)象被釋放,如果它等待的Mutex對(duì)象被釋放了,它就自動(dòng)擁有這個(gè)對(duì)象,直到它調(diào)用Mutex.ReleaseMutex()方法釋放這個(gè)對(duì)象,而在此期間,其他想要獲取這個(gè)Mutex對(duì)象的線程都只有等待。,,【范例10-

26、3】 演示Mutex類的使用,Mutex類的使用,也許需要事先聲明一個(gè)互斥體,我們使用一個(gè)簡(jiǎn)單的程序演示Mutex類的使用。,10.2.4 Monitor類同步數(shù)據(jù)訪問數(shù),當(dāng)多線程公用一個(gè)對(duì)象時(shí),也會(huì)出現(xiàn)和公用代碼類似的問題,這種問題就不應(yīng)該使用lock關(guān)鍵字了,這里需要用到System.Threading中的一個(gè)類Monitor,我們可以稱之為監(jiān)視器,Monitor提供了使線程共享資源的方案。C# Monitor類可以鎖定對(duì)象,

27、一個(gè)線程只有得到這把鎖才可以對(duì)該對(duì)象進(jìn)行操作。對(duì)象鎖機(jī)制保證了在可能引起混亂的情況下一個(gè)時(shí)刻只有一個(gè)線程可以訪問這個(gè)對(duì)象。,,第 10 章齊頭并進(jìn)完成任務(wù)——多線程操作,多線程和多線程的實(shí)現(xiàn) 線程間數(shù)據(jù)同步 帶參數(shù)的線程線程池,10.3 帶參數(shù)的線程,.Net讓我們很輕松就可以創(chuàng)建一個(gè)線程,但是它提供的創(chuàng)建線程和啟動(dòng)線程的方法沒有明顯的提供參數(shù),假如我們要用線程來啟動(dòng)類里面一個(gè)帶參數(shù)的方法該怎么辦?在多線程或單線程任務(wù)中,讓線

28、程帶傳入?yún)?shù)一直是個(gè)麻煩的問題,我們將介紹C#中帶參數(shù)線程處理方法。,10.3.1 帶參數(shù)線程處理函數(shù),在不傳遞參數(shù)情況下,使用ThreadStart代理來連接執(zhí)行函數(shù),如果希望傳遞參數(shù)給執(zhí)行函數(shù),則使用ParameterizedThreadStart代理來鏈接執(zhí)行函數(shù),使用Thread類提供給我們四個(gè)重載的構(gòu)造函數(shù):Thread (ThreadStart):初始化 Thread 類的新實(shí)例。 Thread (Parameteri

29、zedThreadStart):初始化 Thread 類的新實(shí)例,指定允許對(duì)象在線程啟動(dòng)時(shí)傳遞給線程的委托。 Thread (ParameterizedThreadStart, Int32):初始化 Thread 類的新實(shí)例,指定允許對(duì)象在線程啟動(dòng)時(shí)傳遞給線程的委托,并指定線程的最大堆棧大小。 Thread (ThreadStart, Int32):初始化 Thread 類的新實(shí)例,指定線程的最大堆棧大小。,10.3.2 使用

30、帶參數(shù)線程,在處理的時(shí)候,如果不帶參數(shù)的線程用ThreadStart,如果帶一個(gè)參數(shù)的時(shí)候我們用ParameterizedThreadStart。帶多個(gè)參數(shù)的用另外的方法。 下面我們看一下具體的情況:1. 不帶參數(shù)的情況下,使用下面的示例程序就可以完成一個(gè)最簡(jiǎn)單線程程序:2. 帶一個(gè)參數(shù)的 由于ParameterizedThreadStart要求參數(shù)類型必須為object,所以定義的方法MethodsOne形參類型必須為objec

31、t。3. 帶多個(gè)參數(shù)的 由于Thread默認(rèn)只提供了這兩種構(gòu)造函數(shù),如果需要傳遞多個(gè)參數(shù),我們可以自己將參數(shù)作為類的屬性。定義類的對(duì)象時(shí)候?qū)嵗@個(gè)屬性,然后進(jìn)行操作。,,4. 利用結(jié)構(gòu)體給參數(shù)傳值。 為多線程方法調(diào)用提供多個(gè)參數(shù)的最好辦法是將目標(biāo)方法包裹在結(jié)構(gòu)中,這種方法的優(yōu)點(diǎn)是,無論需要傳遞任何參數(shù),都可以在結(jié)構(gòu)內(nèi)方便的完成封裝和傳遞。,第 10 章齊頭并進(jìn)完成任務(wù)——多線程操作,多線程和多線程的實(shí)現(xiàn) 線程間數(shù)據(jù)同步 帶

32、參數(shù)的線程線程池,10.4 線程池,“線程池”是可以用來在后臺(tái)執(zhí)行多個(gè)任務(wù)的線程集合。這使主線程可以自由地異步執(zhí)行其他任務(wù)。線程池通常用于服務(wù)器應(yīng)用程序。每個(gè)傳入請(qǐng)求都將分配給線程池中的一個(gè)線程,因此可以異步處理請(qǐng)求,而不會(huì)占用主線程,也不會(huì)延遲后續(xù)請(qǐng)求的處理。 一旦池中的某個(gè)線程完成任務(wù),它將返回到等待線程隊(duì)列中,等待被再次使用。這種重用使應(yīng)用程序可以避免為每個(gè)任務(wù)創(chuàng)建新線程的開銷。線程池通常具有最大線程數(shù)限制。如果所有線程都繁

33、忙,則額外的任務(wù)將放入隊(duì)列中,直到有線程可用時(shí)才能夠得到處理??梢詫?shí)現(xiàn)自己的線程池,但是通過 ThreadPool 類使用 .NET Framework 提供的線程池更容易一些。 ThreadPool 類提供一個(gè)線程池,該線程池可用于發(fā)送工作項(xiàng)、處理異步 I/O、代表其他線程等待以及處理計(jì)時(shí)器,其主要成員如下:,,QueueUserWorkItem(WaitCallback) 將方法排入隊(duì)列以便執(zhí)行。此方法在有線程池線程變得可用時(shí)執(zhí)行

34、。QueueUserWorkItem(WaitCallback, Object) 將方法排入隊(duì)列以便執(zhí)行,并指定包含該方法所用數(shù)據(jù)的對(duì)象。此方法在有線程池線程變得可用時(shí)執(zhí)行。,線程池給我們提供了一種多線程處理形式,處理過程中將任務(wù)添加到隊(duì)列,然后在創(chuàng)建線程后自動(dòng)啟動(dòng)這些任務(wù)。線程池線程都是后臺(tái)線程。每個(gè)線程都使用默認(rèn)堆棧大小,以默認(rèn)的優(yōu)先級(jí)運(yùn)行,并處于多線程單元中。如果某個(gè)線程在托管代碼中空閑(如正在等待某個(gè)事件),則線程池將插入另一

35、個(gè)輔助線程來使所有處理器保持繁忙。如果所有線程池線程都始終保持繁忙,但隊(duì)列中包含掛起的工作,則線程池將在一段時(shí)間之后創(chuàng)建另一個(gè)輔助線程。,線程池特別適合于執(zhí)行一些需要多個(gè)線程的任務(wù)。使用線程池能夠優(yōu)化這些任務(wù)的執(zhí)行過程,從而提高吞吐量,它不僅能夠使系統(tǒng)針對(duì)此進(jìn)程優(yōu)化該執(zhí)行過程,而且還能夠使系統(tǒng)針對(duì)計(jì)算機(jī)上的其他進(jìn)程優(yōu)化該執(zhí)行過程。如果需要啟動(dòng)多個(gè)不同的任務(wù),而不想分別設(shè)置每個(gè)線程的屬性,則可以使用線程池。ThreadPool是一個(gè)靜

36、態(tài)類,它沒有定義任何的構(gòu)造方法,我們只能夠使用它的靜態(tài)方法,它所要做的工作是在后臺(tái)進(jìn)行的。使工作項(xiàng)的排隊(duì)和運(yùn)行更容易,可以給工作者線程傳遞一個(gè)狀態(tài)對(duì)象。狀態(tài)對(duì)象是私有的作用域位于線程層,所以不需要進(jìn)行同步。ThreadPool中的Thread不能手動(dòng)取消,也不用手動(dòng)開始。所以ThreadPool并不適用比較長(zhǎng)的線程。你要做的只是把一個(gè)WaitCallback委托塞給ThreadPool,然后剩下的工作將由系統(tǒng)自動(dòng)完成。系統(tǒng)會(huì)在Thre

37、adPool的線程隊(duì)列中一一啟動(dòng)線程。當(dāng)線程池滿時(shí),多余的線程會(huì)在隊(duì)列里排隊(duì),當(dāng)線程池空閑時(shí),系統(tǒng)自動(dòng)調(diào)入排隊(duì)的線程,以保持系統(tǒng)利用率。,我們的程序中使用ThreadPool來進(jìn)行一些比較耗時(shí)或者需要阻塞的操作。當(dāng)需要復(fù)雜的同步技術(shù),例如事件,或需要對(duì)一個(gè)現(xiàn)場(chǎng)表調(diào)用Join方法時(shí)線程池就不能滿足需求了。在以下情況中不宜使用ThreadPool而應(yīng)該使用單獨(dú)的Thread:線程需要指定優(yōu)先級(jí)線程的執(zhí)行時(shí)間較長(zhǎng)線程在單獨(dú)的線程apar

38、tment中在線程執(zhí)行過程中對(duì)線程存在操作,如打斷,掛起等。通常是將計(jì)算密集型的操作放在worker線程池中運(yùn)行,而線程池的大小會(huì)根據(jù)當(dāng)前的CPU使用量自動(dòng)調(diào)整,通過下面兩個(gè)方法,我們可以設(shè)置線程池的大?。篢hreadPool.SetMaxThreads(10, 200);ThreadPool.SetMinThreads(2, 40);兩個(gè)參數(shù)分別是WorkThread和IO thread的限制。看了這么多關(guān)于線程池的知識(shí),

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論