1. 程式人生 > >Java執行緒的建立、執行緒的生命週期狀態

Java執行緒的建立、執行緒的生命週期狀態

重新認識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時間片再次進入執行狀態。阻塞大致可分為三種:
  1.         等待阻塞:執行的執行緒執行wait()方法,JVM會把該執行緒放入等待池。(wait釋放持有的鎖
  2.         同步阻塞:執行的執行緒獲取物件的同步鎖時,若該同步鎖被其他執行緒佔用,JVM會把該執行緒放入鎖池中。
  3.         其他阻塞:執行中的執行緒執行sleep()方法或者join()方法,或者發出I/O請求(如read是阻塞的),JVM會把執行緒設定為欸阻塞狀態。當sleep超時,join()等待執行緒終止或者超時,或I/O處理結束,執行緒阻塞取消重新進入就緒狀態。(注意,sleep狀態是不會釋放持有的鎖的

 

  • 死亡(dead):執行緒執行完畢或者因為異常退出了run()方法,該執行緒結束生命週期。

           

參考:https://blog.csdn.net/evankaka/article/details/44153709#t3