回覆列表
  • 1 # 手機使用者85324117869

    首先,一個執行緒不應該由其他執行緒來強制中斷或停止,而是應該由執行緒自己自行停止。所以,Thread.stop, Thread.suspend, Thread.resume 都已經被廢棄了。而 Thread.interrupt 的作用其實也不是中斷執行緒,而是「通知執行緒應該中斷了」,具體到底中斷還是繼續執行,應該由被通知的執行緒自己處理。具體來說,當對一個執行緒,呼叫 interrupt() 時,① 如果執行緒處於被阻塞狀態(例如處於sleep, wait, join 等狀態),那麼執行緒將立即退出被阻塞狀態,並丟擲一個InterruptedException異常。僅此而已。② 如果執行緒處於正常活動狀態,那麼會將該執行緒的中斷標誌設定為 true,僅此而已。被設定中斷標誌的執行緒將繼續正常執行,不受影響。interrupt() 並不能真正的中斷執行緒,需要被呼叫的執行緒自己進行配合才行。也就是說,一個執行緒如果有被中斷的需求,那麼就可以這樣做。① 在正常執行任務時,經常檢查本執行緒的中斷標誌位,如果被設定了中斷標誌就自行停止執行緒。② 在呼叫阻塞方法時正確處理InterruptedException異常。(例如,catch異常後就結束執行緒。)

    具體到你的問題,Thread.interrupted()清除標誌位是為了下次繼續檢測標誌位。如果一個執行緒被設定中斷標誌後,選擇結束執行緒那麼自然不存在下次的問題,而如果一個執行緒被設定中斷標識後,進行了一些處理後選擇繼續進行任務,而且這個任務也是需要被中斷的,那麼當然需要清除標誌位了。

  • 中秋節和大豐收的關聯?
  • 長的瘊子疼是怎麼回事?