《Java多線程編程核心技術(第2版)》 —1.11.2 判斷線程是否為停止狀態
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();
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小時內刪除侵權內容。