1. 程式人生 > >Thread狀態學習筆記。

Thread狀態學習筆記。

最近忘了Thread的相關知識,在這做一下筆記,看了一些資料,自己整理了一下。

先上圖:

綠色部分表示都是屬於阻塞狀態,只是產生阻塞的原因,方式不同。

1、執行緒的實現有兩種方式,一是繼承Thread類,二是實現Runnable介面,但不管怎樣,當我們new了這個物件後,執行緒就進入了初始狀態;

2、當該物件呼叫了start()方法,就進入可執行狀態;

3、進入可執行狀態後,當該物件被作業系統選中,獲得CPU時間片就會進入執行狀態;

4、進入執行狀態後情況就比較複雜了

    4.1、run()方法或main()方法結束後,執行緒就進入終止狀態;

    4.2、當執行緒呼叫了自身的sleep()方法或其他執行緒的join()方法,就會進入阻塞狀態(該狀態既停止當前執行緒,但並不釋放所佔有的資源)。當sleep()結束或join()結束後,該執行緒進入可執行狀態,繼續等待OS分配時間片;

    4.3、執行緒呼叫了yield()方法,意思是放棄當前獲得的CPU時間片,回到可執行狀態,這時與其他程序處於同等競爭狀態,OS有可能會接著又讓這個程序進入執行狀態;

   4.4、當執行緒呼叫wait()方法後會進入等待佇列(進入這個狀態會釋放所佔有的所有資源,與阻塞狀態不同),進入這個狀態後,是不能自動喚醒的,必須依靠其他執行緒呼叫notify()或notifyAll()方法才能被喚醒(由於notify()只是喚醒一個執行緒,但我們由不能確定具體喚醒的是哪一個執行緒,也許我們需要喚醒的執行緒不能夠被喚醒,因此在實際使用時,一般都用notifyAll()方法,喚醒有所執行緒),執行緒被喚醒後會進入鎖池,等待獲取鎖標記。