<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ### Java 線程的狀態及切換 JDK中線程狀態的定義: ``` public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED; } ``` Java線程一共有七個狀態 * 新建(New) * 就緒(Ready to run) * 運行中(Running) * 睡眠(Sleeping) * 阻塞(Blocked) * 等待(Waiting) * 死亡(Dead/Terminate) ![](https://img.kancloud.cn/66/f8/66f8323d0adf916cfe276f3eb695e722_800x539.png) ![](https://img.kancloud.cn/a6/f6/a6f66bed709bf023ea1f77f79c037c82_550x315.png) ## 線程間的狀態轉換 ### (1)NEW\(`新建尚未運行/啟動`\) 還沒調用start,或者調用了start\(\)方法,不一定立即改變線程狀態,中間可能需要一些步驟才完成一個線程的啟動。 ### (2)RUNNABLE\(`處于可運行狀態:正在運行或準備運行`\) start調用結束,線程由NEW變成RUNNABLE,存活著,并嘗試占用CPU資源,yield操作時,線程還是Runnable狀態,只是它有一個細節的內部變化,做一個簡單的讓步。在Java層面是Runnable的狀態,并不代表一定處于運行中的狀態,比如BIO中,線程正阻塞在網絡等待的時候,看到的狀態依然是Runnable狀態,而底層線程已經被阻塞住了。 ### (3)BLOCKED\(`等待獲取鎖時進入的狀態`\) 線程被掛起了,原因通常是因為它在等待一個鎖,當某個synchronized正好有線程在使用時,一個線程嘗試進入這個臨界區,就會被阻塞,直到另一個線程走完臨界區或發生了相應鎖對象的wait操作后,它才有機會去爭奪進入臨界區的權利。當搶到鎖之后,才會從blocked狀態恢復到runnable狀態。這個狀態它好像什么也不做一樣。 ### (4)WAITING\(`通過wait方法進入的等待`\) 當調用一下wait,join,park方法調用時,進入waiting狀態。前提是這個線程已經擁有鎖了。 > blocked和waiting狀態的區別是: > A、blocked是虛擬機認為程序還不能進入某個區域,因為同時進去就會有問題,這是一塊臨界區。 > B、發生wait等操作的先決條件是要進入臨界區,也就是線程已經拿到鎖了,自己可能進去做了一些事情,但此時通過判定業務上的參數,發現還有一些其他配合的資源沒有準備充分,那么自己就等等再做其他事情。 在waiting狀態下,如果發生了interrupt操作,則處于該狀態的線程在內部會拋出一個InterruptedException,這個異常應當在run方法內捕獲,使得run方法正常地執行完成,當然捕獲異常后,是決定讓線程繼續運行,還是結束等要根據業務場景才處理。 如果發生了notify動作,則會從等待池當中喚醒一個線程重新恢復到Runnable狀態,如果是notifyall操作,則喚醒所有等待線程。 ### (5)TIMED\_WAITING\(`通過sleep或wait timeout方法進入的限期等待的狀態`\) 通過wait\(t\),sleep\(t\),join\(t\),parkNanos,parkUntil等方法進入此狀態。當時間達到時觸發線程回到工作狀態Runnable。 interrupt只對處于waiting或timed\_waiting狀態的線程起作用,對其他狀態不起作用。 ### (6)TERMINATED\(`線程終止狀態`\) 線程結束了,就處于這種狀態,也就是run方法運行完了。這只是Java語言級別的一種狀態,在操作系統內部可能已經注銷了相應的線程,或者將它復用給其他需要使用線程的請求。 ### 總結 * JAVA中的RUNNABLE狀態并不代表它一定處于運行中狀態,如在BIO中線程正阻塞在網絡等待時,看到的狀態依然是RUNNABLE狀態,而底層線程已被阻塞,這也是JAVA內在一些狀態不協調的問題所在 參考資料: [https://segmentfault.com/a/1190000005006079](https://segmentfault.com/a/1190000005006079)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看