#两阶段中断模式实例
今天学习了知识,感觉非常的好,附上学习代码提供参考。
先附上两阶段中断模式实例的流程图
以下的代码是类似监控的线程的例子,代码每行基本都有备注。
import org.apache.log4j.Logger;
public class DuobleInterupt {
private static Logger logger = Logger.getLogger(DobleInterupt.class);
public static void main(String[] args) throws InterruptedException {
TwoPhaseTerminaiton tpt = new TwoPhaseTerminaiton();
tpt.start(); //启动监控线程
//运行3.5秒
Thread.sleep(3500);
tpt.stop();
}
}
class TwoPhaseTerminaiton{
private static Logger logger = Logger.getLogger(DobleInterupt.class);
private Thread moniter;
//启动监控线程
public void start(){
moniter = new Thread(()->{
while(true){
Thread current = Thread.currentThread();
if(current.isInterrupted() == true){ //中断标志为true,表示被interrupt,
logger.debug("interrupted ,处理后事");
break;
}
//没有中断则继续监控
try {
//以下两行都有可能被打断
//第一行被打断 为异常时的打断,会抛出异常InterrutedException,打断标志位false
//第二行被打断 为正常时的打断, 打断表示为true,不会抛出异常
Thread.sleep(1000);
logger.debug("继续进行 moniter");
} catch (InterruptedException e) {
//上面一行的Interruted会将打断标志设为false
e.printStackTrace();
//此处的逻辑是正常额业务处理
//异常时的打断 中断标志为false,捕获到异常时,在异常处理处重新设置一次打断标记,打断表示会变为true,再次循环时就会break循环
current.interrupt();
}
}
});
moniter.start();
}
//停止监控线程
public void stop(){
moniter.interrupt();
}
}
学习使我快乐,每天学习一点点。