1. 程式人生 > >java多執行緒:3 執行緒狀態

java多執行緒:3 執行緒狀態

執行緒從建立到結束執行,經過多個狀態,每個狀態對應著不同的操作,具體如下:
1 建立(new),2 可以執行(runnable)、3 執行(running)、4 等待(waiting)、5 阻塞(blocked)、6 結束(dead)

執行緒的狀態流轉

  1. 建立執行緒
    當通過new Thread的時候,這就建立了一個執行緒物件,注意此時僅僅是建立,還沒有啟動。
  2. 可以執行
    當呼叫start()方法後,執行緒就屬於可執行狀態,但是此時並沒有真正的在cpu中進行運算,這需要等待cpu進行排程,分配時間片。
  3. 執行
    當cpu排程,分配時間片後,執行緒就是真正的運行了,可以進行相關的運算處理。此時執行緒就會出現不同的分支:1. 時間片使用完或者呼叫yield()讓出cpu,重新返回到runnable狀態。2 執行緒本身主動的呼叫wait(等待),處於等待狀態(waiting)。3 執行緒因為執行緒之間的訪問限制,或者主動的sleep,那麼執行緒就處於阻塞(blocked)狀態,例如:synchronized、lock、Thread.sleep()等,處於阻塞狀態。
  4. 等待
    執行緒主動呼叫wait()方法或者wait(等待時間),那麼當其他執行緒呼叫notyfy()/notyfyAll(),或者等待時間到了,那麼執行緒就會處於可執行狀態。
  5. 阻塞
    通過synchronized、lock、Thread.sleep()執行緒都是處於阻塞,這有其他執行緒釋放了鎖,或者執行緒的sleep被打斷interrupt()。
  6. 結束 執行緒執行完run方法後,就可以認為執行緒執行結束,因此可以在run方法的最後,做執行緒執行結束的表明。
public class ThreadCreate {
	//list儲存已經完成的thread物件,當然了使用ArrayList還是有缺陷的,因為list不能用於併發,但是為了方便暫時先使用。
	static List<Thread> list = new ArrayList<Thread>();
	public static void main(String[] args) throws InterruptedException {
		for(int i=0;i<10;i++){
			new Thread(new Runnable() {
				public void run() {
					//模擬執行緒計算
					int i = new Random().nextInt(100000)+1100;
					while(i>0){
						i--;
					}
					System.out.println(Thread.currentThread().getName()+" 完成計算-----");
					//add標明當前執行緒已經完成操作
					list.add(Thread.currentThread());
				}
			}).start();
		}
		//輸出已經完成的執行緒
		while(list.size() != 10){
			for(int i =0;i<list.size();i++){
				System.out.println(list.get(i).getName()+" 結束");
			}
			System.out.println("-------------");
		}
	}
}

說明:上述程式碼還是存有一定的缺陷,但是主要是通過這種形式說明如何標明執行緒執行完成,  
因為當時特別蠢的思考了好長時間,如何判斷執行緒是否完成。當然了判斷是否結束執行,  
並不一定使用list進行儲存,可以通過其他形式進行標明。  

說明:上述的執行緒圖,是引用文章:https://www.cnblogs.com/wxd0108/p/5479442.html,這也是一個講解執行緒和通訊的文章,也不錯哦