设计模式之两段终止
- 描述:在线程T1中优雅的关闭线程T2
- 优雅:让线程T2料理后事(比如释放锁)
- 不可以采用stop方法,因为stop会直接停止线程,没有给线程料理后事的机会,有些锁来不及释放的话其他的线程永远都拿不到锁了
- 两种打断方式:
- 打断阻塞线程:处于sleep、wait、join,会报异常,并清除isinterrupted状态(即变为false)
- 打断正常运行的线程:isinterrupted会被置为true
@Slf4j(topic = "c.TwoPhaseTermination")
public class Test13 {
public static void main(String[] args) throws InterruptedException {
TwoPhaseTermination tpt = new TwoPhaseTermination();
tpt.start();
Thread.sleep(3500);
tpt.stop();
}
}
@Slf4j(topic = "c.TwoPhaseTermination")
class TwoPhaseTermination {
private Thread monitorThread;
public void start() {
monitorThread = new Thread(() -> {
while (true) {
Thread current = Thread.currentThread();
if (current.isInterrupted()) {
log.debug("料理后事");
break;
}
try {
Thread.sleep(1000);
log.debug("执行监控记录");
} catch (InterruptedException e) {
e.printStackTrace();
current.interrupt();
}
}
}, "monitor");
monitorThread.start();
}
public void stop() {
monitorThread.interrupt();
}
}
@Slf4j(topic = "c.TwoPhaseTermination")
public class Test13 {
public static void main(String[] args) throws InterruptedException {
TwoPhaseTermination tpt = new TwoPhaseTermination();
tpt.start();
Thread.sleep(3500);
tpt.stop();
}
}
@Slf4j(topic = "c.TwoPhaseTermination")
class TwoPhaseTermination {
private Thread monitorThread;
private volatile boolean stop = false;
public void start() {
monitorThread = new Thread(() -> {
while (true) {
Thread current = Thread.currentThread();
if (stop) {
log.debug("料理后事");
break;
}
try {
Thread.sleep(1000);
log.debug("执行监控记录");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "monitor");
monitorThread.start();
}
public void stop() {
stop = true;
monitorThread.interrupt();
}
}