Java執行緒的建立、執行緒的生命週期狀態
阿新 • • 發佈:2018-11-11
重新認識Java執行緒建立的三種方式:
繼承Thread類
1.通過繼承Thread類建立Thread子類,並重寫run方法。run方法的方法體表示執行緒類要完成的任務,因此也把run方法稱為執行體。
2.建立Thread子類的例項物件,就是建立了執行緒物件。
3.呼叫start方法啟動執行緒。
//執行緒類 public class xiancheng extends Thread{ @Override public void run() { //執行體 } } //啟動方法 Thread th = new Thread(); th.start();
實現Runnable介面
1.定義Runnable介面的實現類,並重寫介面的run方法。這個run方法同樣是執行體。
2.建立Runnable實現類的例項物件,並依此例項作為Thread的target來建立Thread物件。Thread物件才是真正的執行緒物件。
3.呼叫執行緒物件的start方法啟動執行緒。
//執行緒類 public class xiancheng implements Runnable{ @Override public void run() { //執行體 } } //啟動方法 xiancheng xc = new xiancheng(); Thread th = new Thread(xc); th.start();
通過Callable和Future建立執行緒
1.定義Callable介面的實現類,並重寫call方法,此時call方法作為執行緒執行體,並且有返回值。
2.建立Callable實現類的例項物件,使用FutureTask類來包裝該例項物件。此時FutureTask的物件封裝了call方法得到返回值。 FutureTask是一個包裝器,它通過接受Callable來建立,它同時實現了 Future和Runnable介面
3.使用FutureTask物件作為Thread的target物件建立執行緒物件,start方法啟動執行緒。
4.呼叫FutureTask物件的get方法可以獲得執行緒結束的返回值。
//執行緒類
public class xiancheng implements Callable<Integer>{
@Override
public Integer call() throws Exception {
//執行體
return null;
}
}
//啟動方法
xiancheng ab = new xiancheng();
FutureTask<Integer> ft = new FutureTask<>(ab);
Thread th = new Thread(ft);
th.start();
執行緒的執行狀態(也叫生命週期,這裡只分了5個,好像大家各有各的說法)
Java執行緒的5種狀態分別是:
- 新建(new):新建了一個執行緒物件,此時並沒有呼叫start方法
- 就緒(ready):執行緒建立以後被呼叫了start方法,該狀態下執行緒位於可執行執行緒池中,等待被執行緒排程選中獲得CPU的使用權(一個CPU同一時間只能執行一個執行緒),此時處於就緒(ready)狀態。
- 執行(runnable):就緒狀態的執行緒獲得CPU的時間片之後開始執行,執行run方法中的程式碼,變為執行中(runnable)狀態。
- 阻塞(blocked):表示執行緒阻塞於鎖。阻塞是因為執行緒由於某種原因放棄CPU的使用權,暫時停止執行。直到執行緒回到就緒狀態,才有機會重新獲得CPU時間片再次進入執行狀態。阻塞大致可分為三種:
- 等待阻塞:執行的執行緒執行wait()方法,JVM會把該執行緒放入等待池。(wait釋放持有的鎖)
- 同步阻塞:執行的執行緒獲取物件的同步鎖時,若該同步鎖被其他執行緒佔用,JVM會把該執行緒放入鎖池中。
- 其他阻塞:執行中的執行緒執行sleep()方法或者join()方法,或者發出I/O請求(如read是阻塞的),JVM會把執行緒設定為欸阻塞狀態。當sleep超時,join()等待執行緒終止或者超時,或I/O處理結束,執行緒阻塞取消重新進入就緒狀態。(注意,sleep狀態是不會釋放持有的鎖的)
- 死亡(dead):執行緒執行完畢或者因為異常退出了run()方法,該執行緒結束生命週期。
參考:https://blog.csdn.net/evankaka/article/details/44153709#t3