久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

線程的阻塞

 isudong 2015-08-31
 所謂的阻塞,,就是線程能夠運(yùn)行,,但是某個(gè)條件阻止它的運(yùn)行,當(dāng)線程處于阻塞狀態(tài)時(shí),,調(diào)度器將忽略線程,,不會(huì)分配給線程任何CPU時(shí)間,直到線程重新進(jìn)入就緒狀態(tài),,它才有可能執(zhí)行操作,。就緒并代表是在運(yùn)行啊,所謂的就緒,,就是可運(yùn)行也可不運(yùn)行,,只要調(diào)度器分配時(shí)間片給線程,線程就可以運(yùn)行,,因?yàn)槲覀兌贾?,調(diào)度器是如何分配線程,是不確定的,。為什么任務(wù)會(huì)進(jìn)入阻塞的狀態(tài),,一般有以下幾個(gè)原因:
        1.通過(guò)調(diào)用sleep(milliseconds)使任務(wù)進(jìn)入休眠狀態(tài),在這種情況下,任務(wù)在指定的時(shí)間內(nèi)不會(huì)運(yùn)行,;
        2.通過(guò)調(diào)用wait()使線程掛起,,直到線程得到了notify()或notifyAll()消息(或者java SE5的java.util.concurrent類庫(kù)中等價(jià)的signal()或signalAll()),線程才會(huì)進(jìn)入就緒狀態(tài);
        3.任務(wù)在等到某個(gè)輸入或輸出完成,;
        4.任務(wù)試圖在某個(gè)對(duì)象上調(diào)用其同步控制方法,,但是對(duì)象鎖不可用,因?yàn)榱硪粋€(gè)任務(wù)已經(jīng)獲取這個(gè)鎖,;
        阻塞的任務(wù)是必須終止的,,我們不能等待其到達(dá)代碼中可以檢查其狀態(tài)值的某一點(diǎn),因而決定讓它主動(dòng)終止,,那么就必須強(qiáng)制這個(gè)任務(wù)跳出阻塞狀態(tài),。那么怎樣使任務(wù)跳出阻塞狀態(tài)?就是中斷,。中斷,?沒(méi)錯(cuò),就是中斷,,但是中斷是會(huì)拋出異常的?。](méi)問(wèn)題,,只要不拋出就行,!Thread.interrupted()提供了離開(kāi)run()而不拋出異常的方式。為了調(diào)用interrupt(),,我們就必須持有Thread對(duì)象,,但是現(xiàn)在java的concurrent類庫(kù)在避免對(duì)Thread對(duì)象的直接操作,盡量通過(guò)Executor來(lái)執(zhí)行所有操作,。如果我們?cè)贓xecutor上調(diào)用shutdownNow(),那么它 將發(fā)送一個(gè)interrupt()調(diào)用給它啟動(dòng)的所有線程,。為什么呢,?因?yàn)楫?dāng)我們完成工程中的某個(gè)部分或者整個(gè)程序時(shí),通常會(huì)希望同時(shí)關(guān)閉某個(gè)特定Executor的所有任務(wù),。但是我們也想要只中斷某個(gè)單一的任務(wù),,于是就通過(guò)調(diào)用submit()而不是executor()來(lái)啟動(dòng)任務(wù),就可以持有任務(wù)的上下文,。submit()將返回一個(gè)Future<?>,,其中有一個(gè)未修飾的參數(shù)。為什么要用這個(gè)泛型的<?>,?其實(shí)我也對(duì)這個(gè)感到興趣,,但是一時(shí)半會(huì)還是理解不了,所以先放一邊吧。持有這種Future的關(guān)鍵在于可以在其上調(diào)用cancel(),,因此可以使用它來(lái)中斷某個(gè)特定的任務(wù),,如果我們將true傳遞給cancel(),那么就會(huì)擁有在該線程上調(diào)用interrupt()以停止這個(gè)線程的權(quán)限,。所以,,cancel()是一種中斷由Executor啟動(dòng)的單個(gè)線程的方式。如:
       Future<?> f = exec.submit(RunnableClass);
       f.cancel(true);
       但是我們要注意,,不是所有阻塞都可以被中斷的,,第一種情況可以被中斷,但是第3和第4種是不可以被中斷的,,至于第2種有待研究,。
       第3種的解決方案就是利用各種nio類來(lái)使阻塞的nio通道自動(dòng)響應(yīng)中斷。對(duì)于第4種,,使用顯示的ReentrantLock對(duì)象,,因?yàn)樵谒厦孀枞娜蝿?wù)是具備可以被中斷的能力,這與在synchronized方法或臨界區(qū)上阻塞的任務(wù)完全不同,。這時(shí)我們可以直接調(diào)用interrupt()來(lái)中斷被阻塞的任務(wù),,如:lock.interrupt();
       當(dāng)我們?cè)诰€程上調(diào)用interrupt()時(shí),中斷發(fā)生的唯一時(shí)刻是在任務(wù)要進(jìn)入到阻塞操作中,,或者已經(jīng)在阻塞操作內(nèi)部時(shí),,但是如果根據(jù)程序運(yùn)行的環(huán)境,我們可能已經(jīng)編寫了可能會(huì)產(chǎn)生這種阻塞調(diào)用的代碼,,那么該怎么辦,?如果我們只能通過(guò)調(diào)用在阻塞調(diào)用上拋出異常來(lái)退出,那么我們就無(wú)法總是可以離開(kāi)run()循環(huán),。因此如果調(diào)用interrupt()已停止某個(gè)任務(wù),,那么在run()循環(huán)碰巧沒(méi)有產(chǎn)生任何阻塞調(diào)用的情況下,我們的任務(wù)就需要第二種方式來(lái)退出,。于是我們就需要利用中斷狀態(tài),。中斷狀態(tài)是可以通過(guò)調(diào)用interrupted()來(lái)檢查中斷狀態(tài),這不僅可以告訴我們interrupt()是否被調(diào)用過(guò),,而且還可以清除中斷狀態(tài),。清除中斷狀態(tài)可以確保并發(fā)結(jié)構(gòu)不會(huì)就某個(gè)任務(wù)被中斷這個(gè)問(wèn)題通知我們兩次,我們可以經(jīng)由單一的InterruptedException或單一的成功的Thread.interrupted()測(cè)試來(lái)得到這種通知,。如果想要再次檢查以了解是否被中斷,,則可以在調(diào)用Thread.interrupted()時(shí)將結(jié)果存儲(chǔ)起來(lái)。接下來(lái)就是展示檢查的慣用法,,應(yīng)該在run()方法中使用它來(lái)處理在中斷狀態(tài)被設(shè)置時(shí),,被阻塞和不被阻塞的各種可能,,如:
      public void run(){
           try{
                while(!Thread.interrupted()){
                         ....
                         try{
                              //被阻塞的可能
                              try{
                                   //不被阻塞的可能
                              }finally{ ...cleanup();}
                         }finally{.....cleanup();}
                  }
             }catch(InterruptedException e){}
      }
這里的慣用法特別強(qiáng)調(diào),在我們經(jīng)由異常離開(kāi)循環(huán)時(shí),,必須要正確的清理資源,。被設(shè)計(jì)用來(lái)響應(yīng)interrupt()的類必須建立一種策略,來(lái)確保它將保持一致的狀態(tài),,這通常意味著所有需要清理的對(duì)象創(chuàng)建的操作的后面,,都必須緊跟try-finally子句,從而使得無(wú)論run()循環(huán)如何退出,,清理都會(huì)發(fā)生,。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多