今天有同事問到線程的問題,自己突然就有點蒙了,只模糊的記得個大概。
當初學習線程的時候把這7個狀態記得比自己名字還熟悉
還把這7個狀態編成了一段凄慘而美麗的愛情故事
沒想到如今卻只能記得個大概
真驗證了“好記性不如爛筆頭”的真理
還是趕快回憶一下吧
先從圖片開始
小小的作下解釋:
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、當線程剛進入可運行狀態(注意,還沒運行),發現將要調用的資源被
synchroniza(同步),獲取不到鎖標記,將會立即進入
鎖池狀態,等待獲取鎖標記(這時的
鎖池里也許已經有了其他線程在等待獲取
鎖標記,這時它們處于隊列狀態,既先到先得),一旦線程獲得
鎖標記后,就轉入可運行狀態,等待OS分配CPU時間片;
4.5、當線程調用wait()方法后會進入
等待隊列(進入這個狀態會釋放所占有的所有資源,與阻塞狀態不同),進入這個狀態后,是不能自動喚醒的,必須依靠其他線程調用notify()或notifyAll()方法才能被喚醒(由于notify()只是喚醒一個線程,但我們由不能確定具體喚醒的是哪一個線程,也許我們需要喚醒的線程不能夠被喚醒,因此在實際使用時,一般都用notifyAll()方法,喚醒有所線程),線程被喚醒后會進入鎖池,等待獲取鎖標記。
總算全部回憶了一遍JDK1.5在API的使用上有了較好的改進,效率得到很大的提高,不過幾個狀態轉換的原理還是一樣。
額……不過那一段凄慘而美麗的愛情故事還沒完全想起來,那天全部回憶起來了在寫吧。
posted on 2009-06-04 00:06
Liver 閱讀(2190)
評論(2) 編輯 收藏 所屬分類:
CoreJava