Java多線程編程核心技術(第2版)》 —1.11.2 判斷線程是否為停止狀態

      網友投稿 906 2022-05-30

      1.11.2 判斷線程是否為停止狀態

      在學習如何停止線程之前,先來看一下如何判斷線程的狀態已經是停止的。在Java的SDK中,Thread.java類提供了兩個判斷方法。

      1)public static boolean interrupted():測試currentThread()是否已經中斷。

      2)public boolean this.isInterrupted():測試this關鍵字所在類的對象是否已經中斷。

      其中,interrupted()方法的聲明如圖1-39所示。isInterrupted()方法的聲明如圖1-40所示。

      這兩個方法可以判斷線程是否是停止狀態,那么這兩個方法有什么區別呢?先來看看方法this.interrupted()方法的解釋:測試當前線程是否已經中斷,當前線程是指運行this.interrupted()方法的線程。為了對此方法有更深入的了解,創建項目,名稱為t12,類MyThread.java代碼如下:

      public class MyThread extends Thread {

      @Override

      public void run() {

      super.run();

      for (int i = 0; i < 500000; i++) {

      System.out.println("i=" + (i + 1));

      }

      }

      }

      類Run.java代碼如下:

      public class Run {

      public static void main(String[] args) {

      try {

      MyThread thread = new MyThread();

      thread.start();

      Thread.sleep(1000);

      thread.interrupt();

      //Thread.currentThread().interrupt();

      System.out.println("是否停止1?="+thread.interrupted());

      System.out.println("是否停止2?="+thread.interrupted());

      } catch (InterruptedException e) {

      System.out.println("main catch");

      e.printStackTrace();

      }

      System.out.println("end!");

      }

      }

      程序運行結果如圖1-41所示。

      Run.java類雖然通過在thread對象上調用代碼:

      thread.interrupt();

      來停止thread對象所代表的線程,在后面又使用代碼:

      System.out.println("是否停止1?="+thread.interrupted());

      System.out.println("是否停止2?="+thread.interrupted());

      來判斷thread對象所代表的線程是否停止,但從控制臺輸出的結果來看,線程并未停止,這也證明了interrupted()方法的解釋:測試當前線程是否已經中斷。這個“當前線程”是main,從未中斷過,所以輸出的結果是2個false。

      測試代碼中使用thread.interrupted()來判斷currentThread()是否被中斷,也可以使用代碼Thread.interrupted()判斷,因為在Thread.java類中調用靜態static方法時,大多數是針對currentThread()線程進行操作的。

      如何使main線程有中斷效果呢?創建Run2.java,代碼如下:

      public class Run2 {

      public static void main(String[] args) {

      Thread.currentThread().interrupt();

      System.out.println("是否停止1?=" + Thread.interrupted());

      System.out.println("是否停止2?=" + Thread.interrupted());

      System.out.println("end!");

      }

      }

      程序運行結果如圖1-42所示。

      從上述結果來看,interrupted()方法的確判斷了當前線程是否是停止狀態,但為什么第二個布爾值是false呢?查看一下interrupted()方法在官方幫助文檔中的解釋:

      測試當前線程是否已經中斷。線程的中斷狀態由該方法清除。換句話說,如果連續兩次調用該方法,則第二次調用將返回false(在第一次調用已清除了其中斷狀態之后,且第二次調用檢驗完中斷狀態前,當前線程再次中斷的情況除外)。

      文檔已經解釋得很詳細,interrupted()方法具有清除狀態的功能,所以第二次調用interrupted()方法返回的值是false。

      isInterrupted()方法的聲明如下:

      public boolean isInterrupted()

      從聲明中可以看出isInterrupted()方法不是static()方法,作用于調用這個方法的對象。

      繼續創建Run3.java類,代碼如下:

      public class Run3 {

      public static void main(String[] args) {

      try {

      MyThread thread = new MyThread();

      《Java多線程編程核心技術(第2版)》 —1.11.2 判斷線程是否為停止狀態

      thread.start();

      Thread.sleep(1000);

      thread.interrupt();

      System.out.println("是否停止1?="+thread.isInterrupted());

      System.out.println("是否停止2?="+thread.isInterrupted());

      } catch (InterruptedException e) {

      System.out.println("main catch");

      e.printStackTrace();

      }

      System.out.println("end!");

      }

      }

      程序運行結果如圖1-43所示。

      從結果中可以看到,isInterrupted()方法并未清除狀態標志,不具有此功能,所以輸出兩個true。

      綜上所述,這兩個方法的區別如下。

      1)this.interrupted():測試當前線程是否已經是中斷狀態,執行后具有清除狀態標志值為false的功能。

      2)this.isInterrupted():測試線程Thread對象是否已經是中斷狀態,不清除狀態標志。

      軟件開發 Java

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:云脈AI移動教學系統助力提高疫情期間學校教學活動效率
      下一篇:vue項目對接釘釘企業內部H5微應用
      相關文章
      亚洲激情黄色小说| 国产亚洲精品成人久久网站| 亚洲欧美日韩中文字幕一区二区三区 | 日韩亚洲国产高清免费视频| 亚洲精品在线播放| 亚洲黄色网站视频| 内射干少妇亚洲69XXX| 亚洲AV无码不卡在线播放| 亚洲一区二区三区在线观看精品中文| 亚洲AV永久无码精品一区二区国产| 亚洲风情亚Aⅴ在线发布| 亚洲成在人线在线播放无码 | 亚洲老妈激情一区二区三区| 中文字幕无码精品亚洲资源网| 亚洲区不卡顿区在线观看| 亚洲国产综合久久天堂| 亚洲一级片免费看| 亚洲自偷自偷偷色无码中文| 亚洲中文字幕无码中文字在线| 中文字幕第13亚洲另类| 国产精品亚洲аv无码播放| 亚洲va国产va天堂va久久| 久久精品国产精品亚洲色婷婷| 午夜亚洲www湿好大| 久久久久亚洲Av无码专| 亚洲电影在线播放| 亚洲xxxx18| 含羞草国产亚洲精品岁国产精品| 一本色道久久88综合亚洲精品高清 | 亚洲精品美女久久久久9999| 亚洲国产成人久久三区| 亚洲精品456人成在线| 亚洲AV无码专区在线观看成人 | 青草久久精品亚洲综合专区| 亚洲AV无码一区二区三区在线观看 | 亚洲人成电影网站久久| 亚洲成a人片在线不卡一二三区| 国产亚洲男人的天堂在线观看| 亚洲日韩在线第一页| 亚洲AV一宅男色影视| 亚洲精品无码久久久久久久|