两阶段终止
package com.example.demo.hmjuc.day1;
import com.example.demo.hmjuc.Sleep;
import java.util.concurrent.TimeUnit;
/**
* 两阶段终止
*
* @author zhangqi
* @date 2022/4/12 21:21
*/
public class Test5 {
public static void main(String[] args) {
TowPhaseTermination towPhaseTermination = new TowPhaseTermination();
towPhaseTermination.start();
Sleep.sleep(3000);
System.out.println(" 打断线程");
towPhaseTermination.stop();
}
}
class TowPhaseTermination {
private Thread monitor;
private volatile Boolean stop = false;
private volatile boolean starting = false;
/**
* 启动这个线程 睡眠使用TimeUnit.SECONDS.sleep(1)
*/
public void start() {
synchronized (this) {
if (starting) {
return;
}
starting = true;
}
monitor = new Thread(() -> {
while (true) {
System.out.println(" 执行 ");
// 这个静态方法也可以获取中断标记 但是获取完后 会自动清除即如果是 true 就会变成 false
// boolean interrupted = Thread.interrupted();
if (stop) {
System.out.println("线程被中断");
starting = false;
break;
}
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
}
System.out.println("线程结束");
}
});
monitor.start();
}
public void stop() {
stop = true;
monitor.interrupt();
}
}