1、run()
或者call()
方法執行完成,線程正常結束;
2、線程拋出一個未捕獲的Exception或Error;
3、直接調用該線程的stop()
方法來結束該線程;
注意:當主線程結束時,其他線程不受任何影響,并不會隨之結束。一旦子線程啟動起來后,它就擁有和主線程相同的地位,不會受到主線程結束的影響。
為了測試某個線程是否已經死亡,可以調用線程對象的isAlive()
方法,當線程處于就緒、運行、阻塞三種狀態時,該方法將返回true;當線程處于新建、死亡兩種狀態時,該方法就返回false。
如下對線程死亡情況的1和2進行測試。
主線程的代碼如下:
1
2
3
4
5
6
7
8
9
10
11
|
public class ThreadTest { public static void main(String[] args) throws InterruptedException { Thread t = new Thread( new RunTask()); t.start(); while ( true ) { Thread.sleep( 1000 ); System.out.println( "主線程:子線程狀態為" + t.isAlive()); } } } |
測試1:線程正常結束后,isAlive()返回False
編寫線程正常結束的線程執行代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class RunTask implements Runnable { @Override public void run() { for ( int idx = 1 ; idx <= 10 ; idx++) { System.out.println( "子線程:我還活著" + idx); try { Thread.sleep( 3000 ); } catch (InterruptedException e) { e.printStackTrace(); } } } } |
兩個線程的輸出結果如下所示,顯示子線程正常執行結束后,使用Thread.isAlive()
就返回False了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
主線程:子線程狀態為true 主線程:子線程狀態為true 子線程:我還活著8 主線程:子線程狀態為true 主線程:子線程狀態為true 主線程:子線程狀態為true 子線程:我還活著9 主線程:子線程狀態為true 主線程:子線程狀態為true 主線程:子線程狀態為true 子線程:我還活著10 主線程:子線程狀態為true 主線程:子線程狀態為true 主線程:子線程狀態為true 主線程:子線程狀態為false 主線程:子線程狀態為false 主線程:子線程狀態為false 主線程:子線程狀態為false 主線程:子線程狀態為false |
測試2:子線程拋出異常之后,線程的isAlive()返回False
修改子線程的代碼,加入異常拋出:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public class RunTask implements Runnable { @Override public void run() { for ( int idx = 1 ; idx <= 10 ; idx++) { System.out.println( "子線程:我還活著" + idx); try { Thread.sleep( 3000 ); } catch (InterruptedException e) { e.printStackTrace(); } if (idx == 5 ) { throw new RuntimeException( "i am die" ); } } } } |
再次執行,觀察輸出:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
主線程:子線程狀態為true 主線程:子線程狀態為true 主線程:子線程狀態為true 子線程:我還活著4 主線程:子線程狀態為true 主線程:子線程狀態為true 主線程:子線程狀態為true 子線程:我還活著5 主線程:子線程狀態為true 主線程:子線程狀態為true 主線程:子線程狀態為true Exception in thread "Thread-0" java.lang.RuntimeException: i am die at RunTask.run(RunTask.java:15) at java.lang.Thread.run(Thread.java:662) 主線程:子線程狀態為false 主線程:子線程狀態為false 主線程:子線程狀態為false |
可以看到,拋出異常后,子線程直接終止,變成了Flase狀態;
總結
線程正常結束后或者線程拋出了未捕獲的異常,線程變成死亡狀態,使用isAlive()函數返回False。好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
原文鏈接:http://www.crazyant.net/1861.html