第一阶段线程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并发 -- 两阶段终止模式 」获取最佳阅读体验并参与讨论