問題引出
在一個線程$Thread1$裡,如何合理的終止掉$Thread2$線程
錯誤方法
-
使用線程對象的$stop()$方法停止線程
$stop$方法會真正殺死線程,如果這時線程鎖住了共享資源,那麼當他被殺死後就再也沒有機會釋放鎖,其他線程永遠無法擷取鎖
例子
實作
@Slf4j(topic = "c.Test9")
public class Test9 {
public static void main(String[] args) throws InterruptedException {
TwoPhaseTermination tpt = new TwoPhaseTermination();
tpt.start();
Thread.sleep(6500);
tpt.stop();
}
}
@Slf4j(topic = "TwoPhaseTermination")
class TwoPhaseTermination {
private Thread monitor;
//啟動線程監控
public void start() {
monitor = new Thread() {
@Override
public void run() {
while (true) {
if (Thread.currentThread().isInterrupted()) {
log.debug("料理後事");
break;
}
//睡眠兩秒
try {
Thread.sleep(2000);
log.debug("執行監控記錄");
} catch (InterruptedException e) {
e.printStackTrace();
//重新設定打斷标記
currentThread().interrupt();
}
}
}
};
monitor.start();
}
//停止線程監控
public void stop() {
monitor.interrupt();
}
}