java多執行緒:3 執行緒狀態
阿新 • • 發佈:2018-12-02
執行緒從建立到結束執行,經過多個狀態,每個狀態對應著不同的操作,具體如下:
1 建立(new),2 可以執行(runnable)、3 執行(running)、4 等待(waiting)、5 阻塞(blocked)、6 結束(dead)
- 建立執行緒
當通過new Thread的時候,這就建立了一個執行緒物件,注意此時僅僅是建立,還沒有啟動。 - 可以執行
當呼叫start()方法後,執行緒就屬於可執行狀態,但是此時並沒有真正的在cpu中進行運算,這需要等待cpu進行排程,分配時間片。 - 執行
當cpu排程,分配時間片後,執行緒就是真正的運行了,可以進行相關的運算處理。此時執行緒就會出現不同的分支:1. 時間片使用完或者呼叫yield()讓出cpu,重新返回到runnable狀態。2 執行緒本身主動的呼叫wait(等待),處於等待狀態(waiting)。3 執行緒因為執行緒之間的訪問限制,或者主動的sleep,那麼執行緒就處於阻塞(blocked)狀態,例如:synchronized、lock、Thread.sleep()等,處於阻塞狀態。 - 等待
執行緒主動呼叫wait()方法或者wait(等待時間),那麼當其他執行緒呼叫notyfy()/notyfyAll(),或者等待時間到了,那麼執行緒就會處於可執行狀態。 - 阻塞
通過synchronized、lock、Thread.sleep()執行緒都是處於阻塞,這有其他執行緒釋放了鎖,或者執行緒的sleep被打斷interrupt()。 - 結束 執行緒執行完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,這也是一個講解執行緒和通訊的文章,也不錯哦