终止java线程若采用stop方法,容易使共享资源来不及释放,造成死锁。
采用两阶段终止,可防止该情况的发生。
@Slf4j
class TwoPhaseTermination {
private Thread monitor;
public void start() {
monitor = new Thread(() -> {
while (true) {
Thread cur = Thread.currentThread();
if (cur.isInterrupted()) {
log.info("料理后事");
break;
}
try {
Thread.sleep(1000);
log.info("开始执行任务。。。");
} catch (InterruptedException e) {
cur.interrupt();
e.printStackTrace();
}
}
});
monitor.start();
}
public void stop() {
monitor.interrupt();
}
}