win10系統(tǒng)線程異常未處理怎么辦 線程哪些情況會(huì)中斷?
線程哪些情況會(huì)中斷?1.線程正常執(zhí)行,正常結(jié)束。2.監(jiān)控某些條件并結(jié)束線程的不間斷運(yùn)行。3.捕獲InterruptedExcDelphi線程中怎么拋出異常?在D:。線程。結(jié)束的線程。等待也就是先觸發(fā)T
線程哪些情況會(huì)中斷?
1.線程正常執(zhí)行,正常結(jié)束。
2.監(jiān)控某些條件并結(jié)束線程的不間斷運(yùn)行。
3.捕獲InterruptedExc
Delphi線程中怎么拋出異常?
在D:。
線程。結(jié)束的
線程。等待
也就是先觸發(fā)T:真
否則,an "無效句柄 "當(dāng)WaitFor即將結(jié)束時(shí)將導(dǎo)致錯(cuò)誤。當(dāng)窗體關(guān)閉時(shí),該方法將等待一個(gè)事件(因?yàn)榈却?。
因此,如果我們不 t在主窗體中結(jié)束線程,我們不 不一定要使用WaitFor。相反,:使用下面的方法在關(guān)閉表單的代碼中直接調(diào)用fr: Tru:。如果線程。在終止: some function設(shè)置時(shí),嘗試設(shè)置線程。在調(diào)用PcmThrd之前終止: nil。終止,以避免線程結(jié)束后某些函數(shù)中的變量出現(xiàn)空指針錯(cuò)誤。當(dāng)然,這不是絕對(duì)的,需要根據(jù)具體程序來確定。
線程池隊(duì)列大小設(shè)置?
一、ThreadPoolExecutor的重要參數(shù)
CorePoolSize:核心線程的數(shù)量。核心線程會(huì)一直存活,沒有任務(wù)要及時(shí)執(zhí)行。當(dāng)線程數(shù)小于核心線程數(shù)時(shí),即使有空閑線程,線程池也會(huì)優(yōu)先創(chuàng)建新線程進(jìn)行處理。當(dāng)allowCoreThreadTimeouttrue(默認(rèn)為false)被設(shè)置時(shí),核心線程將隨著時(shí)間的推移而關(guān)閉。
QueueCapacity:任務(wù)隊(duì)列容量(阻塞隊(duì)列)
當(dāng)核心線程的數(shù)量達(dá)到最大值時(shí),新任務(wù)將排隊(duì)等待執(zhí)行。
MaxPoolSize:最大線程數(shù)
當(dāng)線程數(shù)為gtcorePoolSize且任務(wù)隊(duì)列已滿時(shí)。線程池創(chuàng)建新的線程來處理任務(wù)。
當(dāng)線程數(shù)為maxPoolSize且任務(wù)隊(duì)列已滿時(shí),線程池將拒絕處理任務(wù)并拋出異常。KeepAliveTime:線程空閑時(shí)間
當(dāng)線程的空閑時(shí)間達(dá)到keepAliveTime時(shí),線程將退出,直到線程數(shù)達(dá)到corePoolSize。
如果allowCoreThreadTimeouttrue,它將一直等到線程數(shù)為0。
AllowCoreThreadTimeout:允許核心線程超時(shí)。
RejectedExecutionHandler:任務(wù)拒絕處理程序
拒絕處理任務(wù)有兩種情況:
當(dāng)線程數(shù)量達(dá)到maxPoolSize且隊(duì)列已滿時(shí),新任務(wù)將被拒絕。
當(dāng)線程池被調(diào)用shutdown()時(shí),它將在關(guān)閉之前等待線程池中的任務(wù)完成。如果在調(diào)用shutdown()和線程池實(shí)際關(guān)閉之間提交了一個(gè)任務(wù),新任務(wù)將被拒絕。
線程池將調(diào)用rejectedExecutionHandler來處理這個(gè)任務(wù)。如果默認(rèn)值為AbortPolicy,將引發(fā)異常。
ThreadPoolExecutor類有幾個(gè)內(nèi)部實(shí)現(xiàn)類來處理這種情況:
AbortPolicy丟棄任務(wù)并引發(fā)運(yùn)行時(shí)異常。
CallerRunsPolicy執(zhí)行任務(wù)
DiscardPolicy忽略它,什么也不會(huì)發(fā)生。
DiscardOldestPolicy將首先進(jìn)入隊(duì)列(最后執(zhí)行)的任務(wù)從隊(duì)列中踢出。
實(shí)現(xiàn)RejectedExecutionHandler接口,可以自定義處理器。
二、ThreadPoolExecutor的執(zhí)行順序
線程池執(zhí)行如下任務(wù)
(1)當(dāng)線程數(shù)小于核心線程數(shù)時(shí),創(chuàng)建線程。
(2)當(dāng)線程數(shù)大于等于核心線程數(shù)且任務(wù)隊(duì)列未滿時(shí),將任務(wù)放入任務(wù)隊(duì)列。
(3)當(dāng)線程數(shù)大于或等于核心線程數(shù)且任務(wù)隊(duì)列已滿時(shí)。
1)如果線程數(shù)小于最大線程數(shù),則創(chuàng)建線程。
2)如果線程數(shù)等于最大線程數(shù),拋出異常,拒絕任務(wù)。
第三,如何設(shè)置參數(shù)
系統(tǒng)默認(rèn)值
核心池大小1
_值
_值
keepAliveTime60s
allowCoreThreadTimeoutfalse
rejectedExecutionHandlerAbortPolicy()
如何設(shè)置它
需要根據(jù)幾個(gè)值來決定。
任務(wù):每秒的任務(wù)數(shù),假設(shè)為500~1000。
Taskcost:每個(gè)任務(wù)都需要時(shí)間,假設(shè)0.1s
Responsetime:系統(tǒng)允許的最大響應(yīng)時(shí)間,假設(shè)為1s。
做一些計(jì)算
corePoolSize每秒需要處理多少線程?
線程計(jì)數(shù)taSks/(1/taskcost)任務(wù)* taskcout (500 ~ 1000) * 0.1 50 ~ 100線程。CorePoolSize設(shè)置應(yīng)大于50。
根據(jù)8020原理,如果每秒80%的任務(wù)小于800,那么corePoolSize可以設(shè)置為80。
queueCapacity(核心大小池/任務(wù)成本)*響應(yīng)時(shí)間
計(jì)算可用隊(duì)列容量80/0.1*1 80。意味著隊(duì)列中的線程可以等待1s,超過1s就需要新的線程來執(zhí)行。
記住它可以 t設(shè)置為_VALUE,這樣隊(duì)列會(huì)非常大,線程數(shù)量只會(huì)保持在corePoolSize大小。當(dāng)任務(wù)急劇增加時(shí),沒有新的線程可以打開執(zhí)行,響應(yīng)時(shí)間會(huì)急劇增加。
maxPoolSize(最大任務(wù)數(shù))-隊(duì)列容量)/(1/任務(wù)成本)
可以得到計(jì)算的maxPoolSize (1000-80)/10 92。
(最大任務(wù)數(shù)-隊(duì)列容量)/每個(gè)線程每秒處理能力的最大線程數(shù)
RejectedExecutionHandler:根據(jù)具體情況,任務(wù)不重要可以丟棄,而重要的任務(wù)要通過一些緩沖機(jī)制來處理。
默認(rèn)情況下,通常滿足KeepAliveTime和allowCoreThreadTimeout。
以上都是理想值,要根據(jù)機(jī)器的性能來決定。如果在未達(dá)到最大線程數(shù)的情況下,機(jī)器的cpu負(fù)載已滿,則需要通過升級(jí)硬件、優(yōu)化代碼、降低taskcost來處理。