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

2021-08-28 16:45:03 字數 844 閱讀 6828

乙個執行緒在未正常結束之前, 被強制終止是很危險的事情. 因為它可能帶來完全預料不到的嚴重後果. 所以你看到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,如果有判斷條件,就告訴判斷條件我要中斷了,該幹嘛幹嘛

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

執行緒 對執行緒的控制

使用thread建立執行緒後,我們需要對執行緒進行 控制 1.使用start 方法,使執行緒處於running狀態,執行緒開始執行 2.使用join 方法,使執行緒進入waitsleepjoin狀態。3.使用sleep 方法,也會使執行緒進入waitsleepjoin狀態。經歷了sleep 方法定義...

對執行緒的總結

一 建立執行緒 重點1 繼承 thread 2 實現 runnable 知識點 其中用到了設計模式中的 模式,角色 持有真實角色的引用。引申到aop,就是用的動態 3 實現 callable 了解 二 執行緒的狀態 1 新生 start 就緒 執行 阻塞 終止2 終止執行緒 重點 3 阻塞 join...

對執行緒安全的理解

方法中的變數不存在非執行緒安全問題,永遠都是執行緒安全的,這是因為方法內部的變數是私有的特性造成的。synchronized鎖加在方法上,鎖的是物件。效果同synchronized this synchronized加在靜態方法上,鎖的是類。效果同synchronized class.class 多...