国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

interrupt(),interrupted() 和 isInterrupted() 的區別

Meathill / 3154人閱讀

摘要:結論先行將調用該方法的對象所表示的線程標記一個停止標記,并不是真的停止該線程。獲取當前線程的中斷狀態,并且會清除線程的狀態標記。因為執行后它會將狀態標志清除,底層調用了,此處參數為。

1. 結論先行
interrupt():將調用該方法的對象所表示的線程標記一個停止標記,并不是真的停止該線程。

interrupted():獲取當前線程的中斷狀態,并且會清除線程的狀態標記。是一個是靜態方法。

isInterrupted():獲取調用該方法的對象所表示的線程,不會清除線程的狀態標記。是一個實例方法。

現在對各方法逐一進行具體介紹:

2. interrupt()

首先我們來使用一下 interrupt() 方法,觀察效果,代碼如下:

public class MainTest {
   @Test
   public void test() {
       try {
           MyThread01 myThread = new MyThread01();
           myThread.start();
           myThread.sleep(2000);
           myThread.interrupt();
       } catch (Exception e) {
           System.out.println("main catch");
           e.printStackTrace();
       }
   }
}

public class MyThread01 extends Thread {
   @Override
   public void run() {
       super.run();
       for (int i = 0; i < 500; i++) {
           System.out.println("i= " + i);
       }
   }
}

輸出結果:

可以看出,子線程已經執行完成了。說明 interrupt() 方法是不能讓線程停止,和我們一開始所說的那樣,它僅僅是在當前線程記下一個停止標記而已。

那么這個停止標記我們又怎么知道呢?——此時就要介紹下面的 interrupted() 和 isInterrupted() 方法了。

3. interrupted() 和 isInterrupted()

interrupted() 方法的聲明為 public static boolean interrupted()

isInterrupted() 方法的聲明為 public boolean isInterrupted()

這兩個方法很相似,下面我們用程序來看下使用效果上的區別吧

先來看下使用 interrupted() 的程序。

@Test
public void test() {
      try {
          MyThread01 myThread = new MyThread01();
          myThread.start();
          myThread.sleep(1000);
//     7行: Thread.currentThread().interrupt(); // Thread.currentThread() 這里表示 main 線程
          myThread.interrupt();
          // myThread.interrupted() 底層調用了 currentThread().isInterrupted(true); 作用是判斷當前線程是否為停止狀態
          System.out.println("是否中斷1 " + myThread.interrupted());
          System.out.println("是否中斷2 " + myThread.interrupted());
      } catch (InterruptedException e) {
          System.out.println("main catch");
      }
  System.out.println("main end");
}

輸出結果:

由此可以看出,線程并未停止,同時也證明了 interrupted() 方法的解釋:測試當前線程是否已經中斷,這個當前線程就是 main 線程,它從未中斷過,所以打印結果都是 false。

那么如何使 main 線程產生中斷效果呢?將上面第 8 行代碼注釋掉,并將第 7 行代碼的注釋去掉再運行,我們就可以得到以下輸出結果:

從結果上看,方法 interrupted() 的確判斷出了當前線程(此例為 main 線程)是否是停止狀態了,但為什么第二個布爾值為 false 呢?我們在最開始的時候有說過——interrupted() 測試當前線程是否已經是中斷狀態,執行后會將狀態標志清除。

因為執行 interrupted() 后它會將狀態標志清除,底層調用了 isInterrupted(true),此處參數為 true 。所以 interrupted() 具有清除狀態標記功能。

在第一次調用時,由于此前執行了 Thread.currentThread().interrupt();,導致當前線程被標記了一個中斷標記,因此第一次調用 interrupted() 時返回 true。因為 interrupted() 具有清除狀態標記功能,所以在第二次調用 interrupted() 方法時會返回 false。

以上就是 interrupted() 的介紹內容,最后我們再來看下 isInterrupted() 方法吧。

isInterrupted() 和 interrupted() 有兩點不同:一是不具有清除狀態標記功能,因為底層傳入 isInterrupted() 方法的參數為 false。二是它判斷的線程調用該方法的對象所表示的線程,本例為 MyThread01 對象。

我們修改一下上面的代碼,看下運行效果:

@Test
public void test() {
   try {
       MyThread01 myThread = new MyThread01();
       myThread.start();
       myThread.sleep(1000);
       myThread.interrupt();
       // 修改了下面這兩行。
       // 上面的代碼是 myThread.interrupted();
       System.out.println("是否中斷1 " + myThread.isInterrupted());
       System.out.println("是否中斷2 " + myThread.isInterrupted());
   } catch (InterruptedException e) {
       System.out.println("main catch");
       e.printStackTrace();
   }
   System.out.println("main end");
}

輸出結果:

結果很明顯,因為 isInterrupted() 不具有清除狀態標記功能,所以兩次都輸出 true。

參考文章:http://www.cnblogs.com/hapjin...

歡迎關注微信公眾號「不只Java」,后臺回復「電子書」,送說不定有你想要的呢

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/72491.html

相關文章

  • Thread中interrupt使用方法

    摘要:合理中斷線程合理中斷在類中提供了和方法這三個方法分別是用來結束暫?;謴途€程但是都已經被標記為廢棄了因為一個線程不應該由其他線程來結束他應該收到別人的通知然后自己在合適的位置結束如果不合理的結束會導致很多意外的結果比如臨界區還沒完全操作完提前 合理中斷線程 合理中斷 在Thread類中,提供了stop(),suspend()和resume()方法,這三個方法分別是用來結束,暫停,恢復線程...

    FingerLiu 評論0 收藏0
  • java中線程池生命周期與線程中斷

    摘要:線程中斷線程中斷就是一種協作機制。它并不會真正的中斷一個正在運行的線程,而只是發出中斷請求,然后由線程在下一個合適的時刻中斷自己。 線程池生命周期包括: RUNNING:接收新的任務并處理隊列中的任務 SHUTDOWN:不接收新的任務,但是處理隊列中的任務 STOP:不接收新的任務,不處理隊列中的任務,同時中斷處理中的任務 TIDYING:所有的任務處理完成,有效的線程數是0 TER...

    suxier 評論0 收藏0
  • Thread類源碼解讀(3)——線程中斷interrupt

    摘要:現在終止一個線程,基本上只能靠曲線救國式的中斷來實現。中斷機制的核心在于中斷狀態和異常中斷狀態設置一個中斷狀態清除一個中斷狀態方法同時會返回線程原來的中斷的狀態。中斷異常中斷異常一般是線程被中斷后,在一些類型的方法如中拋出。 前言 系列文章目錄 線程中斷是一個很重要的概念,通常,取消一個任務的執行,最好的,同時也是最合理的方法,就是通過中斷。 本篇我們主要還是通過源碼分析來看看中斷的概...

    fevin 評論0 收藏0
  • 線程系列一、線程創建與停止

    摘要:接口接口允許我們在線程執行的時候有返回值,以及拋出異常線程的停止類中的個停止方法三者區別將線程標記為中斷返回線程當前的中斷狀態,不清除線程的中斷標記返回線程當前的中斷狀態,并清除線程的中斷標記與本質都是調用了的。 1、通過繼承Thread類 public static class MThread extends Thread{ @Override public voi...

    BlackHole1 評論0 收藏0
  • Java Executors 源碼分析

    摘要:表示一個異步任務的結果,就是向線程池提交一個任務后,它會返回對應的對象。它們分別提供兩個重要的功能阻塞當前線程等待一段時間直到完成或者異常終止取消任務。此時,線程從中返回,然后檢查當前的狀態已經被改變,隨后退出循環。 0 引言 前段時間需要把一個C++的項目port到Java中,因此時隔三年后重新熟悉了下Java。由于需要一個通用的線程池,自然而然就想到了Executors。 用了...

    itvincent 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<