終止阻塞的線程-編程開發(fā)技術(shù)

終止阻塞的線程-編程開發(fā)技術(shù)

ID:30922528

大小:76.00 KB

頁(yè)數(shù):7頁(yè)

時(shí)間:2019-01-04

終止阻塞的線程-編程開發(fā)技術(shù)_第1頁(yè)
終止阻塞的線程-編程開發(fā)技術(shù)_第2頁(yè)
終止阻塞的線程-編程開發(fā)技術(shù)_第3頁(yè)
終止阻塞的線程-編程開發(fā)技術(shù)_第4頁(yè)
終止阻塞的線程-編程開發(fā)技術(shù)_第5頁(yè)
資源描述:

《終止阻塞的線程-編程開發(fā)技術(shù)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。

1、終止阻塞的線程-編程開發(fā)技術(shù)終止阻塞的線程原文出處:擺渡者線程狀態(tài)我們知道,一個(gè)線程可以處于以下四種狀態(tài)Z-:1??新建(New):當(dāng)線程被創(chuàng)建時(shí),它只會(huì)短暫地處于這種狀態(tài)。此時(shí)它已經(jīng)分配了必須的系統(tǒng)資源,并執(zhí)行了初始化。此刻線程已經(jīng)有資格獲取CPU時(shí)間了,之后調(diào)度器將把這個(gè)線程轉(zhuǎn)變?yōu)榭蛇\(yùn)行狀態(tài)或阻塞狀態(tài)。2.?就緒(Runnable):在這種狀態(tài)下,只要調(diào)度器將CPU吋間片分給線程,線程就可以運(yùn)行。也就是說(shuō),在任意時(shí)刻,線程可以運(yùn)行也可以不運(yùn)行。3??阻塞(Blocked):線程能夠運(yùn)行,但有某個(gè)

2、或多個(gè)條件阻止它運(yùn)行。當(dāng)線程處于阻塞狀態(tài)時(shí),調(diào)度器將忽略線程,不會(huì)分配給線程任何CPU時(shí)間片。直到線程重新進(jìn)入了就緒狀態(tài),它才有可能執(zhí)行操作。4.?死亡(Dead):處于死亡或終止?fàn)顟B(tài)的線程將不再是可調(diào)度的,并且再也不會(huì)得到CPU時(shí)間,它的任務(wù)已經(jīng)結(jié)束,或不再是可運(yùn)行的。任務(wù)死亡的通常方式是從run()方法返回,但是任務(wù)的線程還可以不被屮斷。進(jìn)入線程狀態(tài)而一個(gè)任務(wù)進(jìn)入阻塞狀態(tài),可能由以下原因造成:1.通過(guò)調(diào)用sleep(milliseconds)方法使任務(wù)進(jìn)入休眠狀態(tài),在這種情況下,任務(wù)在指定的時(shí)間

3、內(nèi)不會(huì)運(yùn)行。2.通過(guò)調(diào)用wait()方法使線程掛起。直到線程得到了notify()或notifyAllO消息(或者在JavaSE5的java.util,concurrent類庫(kù)中等價(jià)的signal()活signalAHO消息),線程才會(huì)進(jìn)入就緒狀態(tài)。3.任務(wù)在等待某個(gè)I/O操作完成。4.任務(wù)試圖在某個(gè)對(duì)象上調(diào)用其同步控制方法,但是對(duì)象鎖不可用,因?yàn)榱硪粋€(gè)任務(wù)已經(jīng)獲取了這個(gè)鎖。在較早的代碼中,也可能會(huì)看到用suspend()和resume()方法來(lái)阻塞和喚醒線程,但是在Java新版木小這些方法被廢棄了

4、,因?yàn)樗鼈兛赡軐?dǎo)致死鎖。stop()方法也已經(jīng)被廢棄了,因?yàn)樗会尫啪€程獲得的鎖,并且如果線程處于不一致的狀態(tài),其他任務(wù)可以在這種狀態(tài)2劉覽并修改它們?,F(xiàn)在我們需要查看的問(wèn)題是:冇事你希望能夠終止處于阻塞狀態(tài)的任務(wù)。如呆對(duì)于阻塞裝填的任務(wù),你不能等待其到達(dá)代碼中可以檢查其狀態(tài)值的某一點(diǎn),因而決定讓它主動(dòng)終止,那么你就必須強(qiáng)制這個(gè)任務(wù)跳出阻塞狀態(tài)。中斷止如你所想象的,在Runnable,run()方法的中間打斷它,與到達(dá)程序員準(zhǔn)備好離開該方法的其他一些地方相比,要復(fù)雜得多。因?yàn)楫?dāng)你打斷被阻塞的任務(wù)時(shí),

5、可能需要清理資源。正因?yàn)檫@一點(diǎn),在任務(wù)的run()方法屮間打斷,更像是拋出的異常,因此在Java線程中的這種類型的異常中斷中用到了異常。為了在以這種方式終止任務(wù)吋返冋良好的狀態(tài),你必須仔細(xì)考慮代碼的執(zhí)行路徑,并仔細(xì)編寫catch字句以便正確的清楚所有事物。Thread類包含了interrupt()方法,因此你可以終止被阻塞的任務(wù),這個(gè)方法將設(shè)置線程的屮斷狀態(tài)。如果一個(gè)線程已經(jīng)被阻塞,或者試圖執(zhí)行一個(gè)阻塞操作,那么設(shè)置這個(gè)線程的中斷狀態(tài)將拋出InterruptedExceptiono當(dāng)拋出該異常或者該

6、任務(wù)調(diào)用Thread,interrupted()吋,【I【斷狀態(tài)將被復(fù)位。正如你將看到的,Thread,interrupted()提供了離開run()循環(huán)而不拋出異常的第二種方式。為了調(diào)用interrupt(),你必須持有Thread對(duì)彖。你可能已經(jīng)注意到了,新的concurrent類庫(kù)似乎在避免對(duì)Thread對(duì)象上的直接操作,轉(zhuǎn)而盡量的通過(guò)Executor來(lái)執(zhí)行所有操作。如果你在Executor上調(diào)用shutdownNowO,那么它將發(fā)送一個(gè)interrupt()調(diào)用給它啟動(dòng)的線程。這么做是有意義

7、的,因?yàn)楫?dāng)你完成工程中的某個(gè)部分或者整個(gè)程序時(shí),通常會(huì)希望同時(shí)關(guān)閉某個(gè)特定Executor的所有任務(wù)。然而,你有時(shí)也會(huì)希望只中斷某個(gè)單一?任務(wù)。如果使用Executor,那么通過(guò)調(diào)用submit()方法而不是execute()方法來(lái)啟動(dòng)任務(wù),就可以持右該任務(wù)的上下文。submit()將返冋一個(gè)泛型Future,其中有一個(gè)未修飾的參數(shù),因?yàn)槟阌肋h(yuǎn)都不會(huì)在其上調(diào)用get()——持有這種Future的關(guān)鍵在于你可以在其上調(diào)用cancel0,并因此可以使用它來(lái)中斷某個(gè)特定任務(wù)。如果你將true傳遞給c

8、ancel(),那么它就會(huì)擁有在該線程上調(diào)用interrupt()以停止這個(gè)線程的能力。因此,cancel是一種中斷由Executor啟動(dòng)的單個(gè)線程的方式。下面的示例使用Executor展示了基本的interrupt()用法:importjava.io.IOException;importjava.io.TnputStream;importjava.util,concurrcnt.ExecutorScrvicc;importjava?util,concurrent.E

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無(wú)此問(wèn)題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫(kù)負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無(wú)法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。