qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          Java編程體驗:線程的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 2011-11-10 09:44 順其自然EVO 閱讀(161) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2011年11月>
          303112345
          6789101112
          13141516171819
          20212223242526
          27282930123
          45678910

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 晴隆县| 陇西县| 盱眙县| 伊川县| 长垣县| 温泉县| 揭阳市| 固原市| 长乐市| 双柏县| 奉贤区| 电白县| 个旧市| 赤水市| 南丹县| 林芝县| 阿瓦提县| 娱乐| 栾城县| 宁城县| 名山县| 自治县| 清镇市| 阜宁县| 通渭县| 洪湖市| 宝山区| 平定县| 凭祥市| 琼中| 南丰县| 宁乡县| 德令哈市| 宝鸡市| 昌黎县| 友谊县| 揭东县| 合山市| 宁南县| 达孜县| 马尔康县|