天天看點

兩階段終止模式問題引出例子

問題引出

在一個線程$Thread1$裡,如何合理的終止掉$Thread2$線程

錯誤方法

  1. 使用線程對象的$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();
    }
}
           
上一篇: 對象映射器