日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

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

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

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

甚么是中斷?

在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后會自動清除中斷狀態?
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 日韩精品在线一区二区 | 日韩91| 国产精品页 | 亚洲精品一区二区在线 | 一区二区三区在线视频免费观看 | 国产精品国产a级 | 毛片网站在线观看 | 日韩欧美在线观看视频 | 精品久久久久久久久久久 | 黄a视频在线观看 | 免费毛片在线 | 亚洲免费在线观看视频 | 久久二区视频 | 人妖在线视频 | 亚洲一区二区国产 | 亚洲最新色 | 亚洲精品综合在线观看 | 色婷婷综合久久久中字幕精品久久 | 国产成人福利在线 | 日韩在线观看中文字幕 | 成年人视频免费在线观看 | 在线免费成人 | 成人亚洲免费 | 精品国产青草久久久久96 | 午夜精品久久久久久久96蜜桃 | 久久亚洲国产视频 | 国产成人在线观看免费网站 | 日韩国产一区 | av不卡在线 | 欧美一区二区三区电影 | 不卡的一区二区 | 中文字幕国产一区二区 | 国产午夜精品一区二区三区欧美 | 麻豆视频传媒入口 | 日韩成人性视频 | 久久性生活免费视频 | 在线日韩欧美 | 免费成人黄色网址 | 国产精品久久久久久久午夜片 | 久久99国产精品久久99大师 | 日韩欧美精品在线视频 |