多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > Java并發編程的藝術(五)——中斷

Java并發編程的藝術(五)——中斷

來源:程序員人生   發布時間:2017-03-13 17:32:03 閱讀次數:4166次

甚么是中斷?

在Java中沒有辦法立即停止1條線程,但是停止線程卻顯得尤其重要,如取消1個耗時操作。因此,Java提供了1種用于停止線程的機制——中斷。

  • 中斷只是1種協作機制,Java沒有給中斷增加任何語法,中斷的進程完全需要程序員自己實現。若要中斷1個線程,你需要手動調用該線程的interrupted方法,該方法也僅僅是將線程對象的中斷標識設成true;接著你需要自己寫代碼不斷地檢測當前線程的標識位;如果為true,表示別的線程要求這條線程中斷,此時究竟該做甚么需要你自己寫代碼實現。
  • 每一個線程對象中都有1個標識,用于表示線程是不是被中斷;該標識位為true表示中斷,為false表示未中斷;
  • 通過調用線程對象的interrupt方法將該線程的標識位設為true;可以在別的線程中調用,也能夠在自己的線程中調用。

中斷的相干方法

  • public void interrupt()
    將調用者線程的中斷狀態設為true。

  • public boolean isInterrupted()
    判斷調用者線程的中斷狀態。

  • public static boolean interrupted
    只能通過Thread.interrupted()調用。
    它會做兩步操作:

    1. 返回當前線程的中斷狀態;
    2. 將當前線程的中斷狀態設為false;

暫停、繼續、停止線程(已過時)

以下3個方法都是通過線程對象去調用。

  • suspend()
    暫停調用者線程,只釋放CPU履行權,不釋放鎖。
    由于在不釋放資源的情況下進入眠眠狀態,容易產生死鎖。因此已過時!

  • resume()
    恢復調用者線程,讓他處于就緒狀態。

  • stop()
    調用stop后,其實不會保證資源被正確地釋放,它會使程序處于不正確的狀態下。

PS:stop和interrupt的區分?

中斷的使用

要使用中斷,首先需要在可能會產生中斷的線程中不斷監聽中斷狀態,1旦產生中斷,就履行相應的中斷處理代碼。
當需要中斷線程時,調用該線程對象的interrupt函數便可。

設置中斷監聽

Thread t1 = new Thread( new Runnable(){
    public void run(){
        // 若未產生中斷,就正常履行任務
        while(!Thread.currentThread.isInterrupted()){
            // 正常任務代碼……
        }

        // 中斷的處理代碼……
        doSomething();
    }
} ).start();

正常的任務代碼被封裝在while循環中,每次履行完1遍任務代碼就檢查1下中斷狀態;1旦產生中斷,則跳過while循環,直接履行后面的中斷處理代碼。

觸發中斷

t1.interrupt();

上述代碼履行后會將t1對象的中斷狀態設為true,此時t1線程的正常任務代碼履行完成后,進入下1次while循環前Thread.currentThread.isInterrupted()的結果為true,此時退出循環,履行循環后面的中斷處理代碼。

安全地停止線程

stop函數停止線程過于暴力,它會立即停止線程,不給任何資源釋放的余地,下面介紹兩種安全停止線程的方法。

循環標記變量

自定義1個同享的boolean類型變量,表示當前線程是不是需要中斷。

  • 中斷標識
volatile boolean interrupted = false;
  • 任務履行函數
Thread t1 = new Thread( new Runnable(){
    public void run(){
        while(!interrupted){
            // 正常任務代碼……
        }
        // 中斷處理代碼……
        // 可以在這里進行資源的釋放等操作……
    }
} );
  • 中斷函數
Thread t2 = new Thread( new Runnable(){
    public void run(){
        interrupted = true;
    }
} );

循環中斷狀態

  • 中斷標識
    由線程對象提供,無需自己定義。

  • 任務履行函數

Thread t1 = new Thread( new Runnable(){
    public void run(){
        while(!Thread.currentThread.isInterrupted()){
            // 正常任務代碼……
        }
        // 中斷處理代碼……
        // 可以在這里進行資源的釋放等操作……
    }
} );
  • 中斷函數
t1.interrupt();

總結

上述兩種方法本質1樣,都是通過循環查看1個同享標記為來判斷線程是不是需要中斷,他們的區分在于:第1種方法的標識位是我們自己設定的,而第2種方法的標識位是Java提供的。除此以外,他們的實現方法是1樣的。

上述兩種方法之所以較為安全,是由于1條線程發出終止信號后,接收線程其實不會立即停止,而是將本次循環的任務履行完,再跳出循環停止線程。另外,程序員又可以在跳出循環后添加額外的代碼進行掃尾工作。

處理中斷

上文都在介紹如何獲得中斷狀態,那末當我們捕獲到中斷狀態后,究竟如何處理呢?

  • Java類庫中提供的1些可能會產生阻塞的方法都會拋InterruptedException異常,如:BlockingQueue#put、BlockingQueue#take、Object#wait、Thread#sleep。
  • 當你在某1條線程中調用這些方法時,這個方法可能會被阻塞很長時間,你可以在別的線程中調用當前線程對象的interrupt方法觸發這些函數拋出InterruptedException異常。
  • 當1個函數拋出InterruptedException異常時,表示這個方法阻塞的時間太久了,他人不想等它履行結束了。
  • 當你的捕獲到1個InterruptedException異常后,亦可以處理它,或向上拋出。
  • 拋出時要注意???:當你捕獲到InterruptedException異常后,當前線程的中斷狀態已被修改成false(表示線程未被中斷);此時你若能夠處理中斷,則不用理睬該值;但如果你繼續向上拋InterruptedException異常,你需要再次調用interrupt方法,將當前線程的中斷狀態設為true。
  • 注意:絕對不能“吞掉中斷”!即捕獲了InterruptedException而不作任何處理。這樣背背了中斷機制的規則,他人想讓你線程中斷,但是你自己不處理,也不將中斷要求告知調用者,調用者1直以為沒有中斷要求。

QA

  1. 為何catch InterruptedException后會自動清除中斷狀態?
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 名优写真一区二区在线 | 国产高清在线看免费视频观 | 亚洲乱码一二三四区国产 | 国产欧美一区二区久久 | 劲爆欧美第一页 | 2020中文字幕| 在线观看网址 | 国产区精品福利在线观看精品 | 国产成人精品视频一区 | 精品一区二区三区视频在线观看免 | 性欧美videofree另类 | 国美女福利视频午夜精品 | 91精品亚洲 | 欧美性videosex18| 欧美亚洲尤物久久精品 | 好吊色永久免费视频大全 | 午夜宅男视频 | 亚洲 欧美 字幕 一区 在线 | 真实国产乱人伦在线视频播放 | 亚洲综合久久1区2区3区 | 成人在线观看视频免费 | 午夜视频在线免费观看 | 国产中文99视频在线观看 | 日本在线视频网 | 日本www免费| 手机看片欧美日韩 | 欧美最刺激好看的一级毛片 | 国产成人精品免费视频大全五级 | 国产在线啪| 国产成人精品日本亚洲直接 | 午夜国产理论 | 第一色区| 中文字幕第99页 | 中文有码在线观看 | 国产福利专区 | 亚洲免费视频网站 | 欧美18vide0sex性欧美在线 | 日本一区二区三区免费看 | 中国毛片网 | 98精品视频 | 精品国产区|