1. 程式人生 > >對執行緒中斷,join,yield的理解

對執行緒中斷,join,yield的理解

一個執行緒在未正常結束之前, 被強制終止是很危險的事情. 因為它可能帶來完全預料不到的嚴重後果. 所以你看到Thread.suspend, Thread.stop等方法都被Deprecated了

那麼不能直接把一個執行緒搞掛掉, 但有時候又有必要讓一個執行緒死掉, 或者讓它結束某種等待的狀態 該怎麼辦呢? 優雅的方法就是, 給那個執行緒一箇中斷訊號, 讓它自己決定該怎麼辦. 比如說, 在某個子執行緒中為了等待一些特定條件的到來, 你呼叫了Thread.sleep(10000), 預期執行緒睡10秒之後自己醒來, 但是如果這個特定條件提前到來的話, 你怎麼通知一個在睡覺的執行緒呢? 又比如說, 主執行緒通過呼叫子執行緒的join方法阻塞自己以等待子執行緒結束, 但是子執行緒執行過程中發現自己沒辦法在短時間內結束, 於是它需要想辦法告訴主執行緒別等我了. 這些情況下, 就需要中斷. 
中斷是通過呼叫Thread.interrupt()方法來做的. 這個方法通過修改了被呼叫執行緒的中斷狀態來告知那個執行緒, 說它被中斷了. 對於非阻塞中的執行緒, 只是改變了中斷狀態, 即Thread.isInterrupted()將返回true; 對於可取消的阻塞狀態中的執行緒, 比如等待在這些函式上的執行緒, Thread.sleep(), Object.wait(), Thread.join(), 這個執行緒收到中斷訊號後, 會丟擲InterruptedException, 同時會把中斷狀態置回為false.

對於可取消的阻塞狀態中的執行緒來說,主要是為了喚醒執行緒,讓他別阻塞了,中斷狀態設為false

對於正常執行的執行緒,將中斷標誌位設為true,如果有判斷條件,就告訴判斷條件我要中斷了,該幹嘛幹嘛

join:在一個執行緒中呼叫另一個執行緒的Join方法是為了順序執行執行緒,如,線上程A 中呼叫了B.join,那麼執行緒A將等待執行緒B執行完後在執行A。

yield:讓出執行機會給別的執行緒,但是當前執行緒也可能繼續得到機會