最近刚开始学线程。
任务
使用sleep,interrupt实现
import org.apache.log4j.Logger;
import static java.lang.Thread.sleep;
public class Demo{
public static void main(String[] agrs) throws InterruptedException {
TwoPhaseTerminate pt=new TwoPhaseTerminate();
pt.start();
//分给monitor线程时间片后,monitor开始运行。
//此时main和monitor线程并行
Thread.sleep(5000);//main线程睡眠5s,monitor还在运行
pt.stop();//main睡眠结束,调用结束方法。线程monitor结束
}
}
class TwoPhaseTerminate{
private static Logger logger = Logger.getLogger(TwoPhaseTerminate.class);
private Thread monitor;
public void start(){
monitor=new Thread(()->{
while(true){
Thread current= Thread.currentThread();
if(current.isInterrupted()){
logger.debug("退出监控");
break;
}
try {
Thread.sleep(2000);//state 1:这里打断,打断标记会被清除
logger.debug("监控中");//state 2:在这里打断没事。
} catch (InterruptedException e) {
e.printStackTrace();
current.interrupt();
//鉴于state 1,在睡眠时打断,标记会被清除
//所以可以在打断一次。这样打断标记就是true
//没有这一句的话,线程会一直运行下去。(不考虑main线程的睡眠时间,
//因为可能刚好在state 2 打断。
}
}
},"monitor");
monitor.start();//main线程调用
}
public void stop(){
monitor.interrupt();
}
}
结果如下