Java 线程状态
線程狀態:
????一個線程可處于以下四種狀態之一:
??????1. 新建(new):當線程被創建時,它只會短暫的處于這種狀態。此時它已經分配了必需的系統資源,并執行了初始化。此刻線程已經有資格獲得CPU 時間了,之后調度器會把這個線程轉變為運行狀態或阻塞狀態。
??????2. 就緒(Runnable):在這種狀態下,只要調度器把時間片分配給線程,線程就可以執行。也就是說,在任意時刻,線程可以運行也可以不運行。只要調度器能分配時間片給線程,它就可以運行,這不同于死亡和阻塞狀態。
??????3. 阻塞(Blocked):線程能夠運行,但有某個條件阻止它運行。當線程處于阻塞狀態時,調度器會忽略此線程,不會分配給線程任何CPU 時間。直到線程重新進入了就緒狀態,它才可能執行操作。
??????4. 死亡 (Dead):處于死亡或者終止狀態的線程將不再是可調度的,并且再也不會得到CPU 時間,它的任務已經結束,或者不再是可運行的。線程死亡的通常方式是從run() 方法返回,但是線程任務還可以被中斷。
阻塞狀態:
????一個任務進入租的狀態可能有以下幾種原因:
??????1. 通過調用sleep(time) 使任務就如休眠狀態,在這種狀態下,任務在指定的時間內不會運行。
??????2. 通過調用await() 使線程掛起。直到線程得到了notify() 或notifyAll() 消息(在Java SE5 的java.util.concurrent 類庫中等價的signal() 或signalAll() 消息),線程就會進入就緒狀態。
??????3. 在任務中等待某個輸入/輸出完成。
??????4. 任務試圖在某個對象上調用其它同步控制方法,但是對象鎖不可用,因為另一個任務已經獲得了這個鎖。
??????在比較早的代碼中可能還會看到suspend() 和resume() 來阻塞和喚醒線程,隨著Java 版本的更新,這些方法已經被廢棄了(因為這可能導致死鎖),stop() 方法也已經被廢棄了,因為它不會釋放線程的鎖。
線程中斷:來源處理 InterruptedException,作者:Brian Goetz ,感謝!
??????每個線程都有一個與之相關聯的 Boolean 屬性,用于表示線程的中斷狀態(interrupted status)。中斷狀態初始時為 false;當另一個線程通過調用 Thread.interrupt() 中斷一個線程時,會出現以下兩種情況之一。如果那個線程在執行一個低級可中斷阻塞方法,例如 Thread.sleep()、 Thread.join() 或 Object.wait(),那么它將取消阻塞并拋出 InterruptedException。否則, interrupt() 只是設置線程的中斷狀態。 在被中斷線程中運行的代碼以后可以輪詢中斷狀態,看看它是否被請求停止正在做的事情。中斷狀態可以通過 Thread.isInterrupted() 來讀取,并且可以通過一個名為 Thread.interrupted() 的操作讀取和清除。
??????中斷是一種協作機制。當一個線程中斷另一個線程時,被中斷的線程不一定要立即停止正在做的事情。相反,中斷是禮貌地請求另一個線程在它愿意并且方便的時候停止它正在做的事情。有些方法,例如 Thread.sleep(),很認真地對待這樣的請求,但每個方法不是一定要對中斷作出響應。對于中斷請求,不阻塞但是仍然要花較長時間執行的方法可以輪詢中斷狀態,并在被中斷的時候提前返回。 您可以隨意忽略中斷請求,但是這樣做的話會影響響應。
??????中斷的協作特性所帶來的一個好處是,它為安全地構造可取消活動提供更大的靈活性。我們很少希望一個活動立即停止;如果活動在正在進行更新的時候被取消,那么程序數據結構可能處于不一致狀態。中斷允許一個可取消活動來清理正在進行的工作,恢復不變量,通知其他活動它要被取消,然后才終止。
????????????????????????????????????????????????????????????????????????????????????????????????????????????參考書籍:
????????????????????????????????????????????????????????????????????????????????????????????????????????????????《Java 編程思想》Bruce Eckel 著 陳昊鵬 譯
總結
- 上一篇: Java 并发时的 互斥锁机制
- 下一篇: 共达电声是国企吗