第一阶段线程T1向线程T2 发送终止指令 ,第二阶段是线程T2 响应终止指令
public class Proxy { private boolean started = false; // 采集线程 private Thread rptThread; // 启动采集线程 public synchronized void start() { // 不允许同时启动多个采集线程 if (started) { return; } started = true; rptThread = new Thread(() -> { // 第二阶段:响应终止指令 while (!Thread.currentThread().isInterrupted()) { // 采集、回传 report(); try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException ignored) { // JVM的异常处理会清除线程的中断状态 // 重置线程中断状态 Thread.currentThread().interrupt(); } } started = false; }); rptThread.start(); } // 终止采集功能 public synchronized void stop() { // 第一阶段:发送终止指令 // 将rptThread从休眠状态切换至RUNNABLE状态 rptThread.interrupt(); } private void report() { } }
很可能在run方法中调用了第三方类库提供的方法,但没办法保证第三方类库都正确地处理了线程的中断状态
public class Proxy { // 线程终止状态 private volatile boolean terminated = true; private boolean started = false; // 采集线程 private Thread rptThread; // 启动采集线程 public synchronized void start() { // 不允许同时启动多个采集线程 if (started) { return; } started = true; terminated = false; rptThread = new Thread(() -> { // 第二阶段:响应终止指令 while (!terminated) { // 采集、回传 report(); try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException ignored) { // JVM的异常处理会清除线程的中断状态 // 重置线程中断状态 Thread.currentThread().interrupt(); } } started = false; }); rptThread.start(); } // 终止采集功能 public synchronized void stop() { // 设置中断标志位 terminated = true; // 第一阶段:发送终止指令 // 将rptThread从休眠状态切换至RUNNABLE状态 rptThread.interrupt(); } private void report() { } }
void shutdown();
List<Runnable> shutdownNow();
转载请注明出处:http://zhongmingmao.me/2019/05/25/java-concurrent-two-phase-stop/
访问原文「 Java并发 -- 两阶段终止模式 」获取最佳阅读体验并参与讨论