设计模式1:两阶段终止设计模式

  • Post author:
  • Post category:其他




一、思路

在这里插入图片描述



二、 利用 isInterrupted

interrupt 可以打断正在执行的线程,无论这个线程是在 sleep,wait,还是正常运行

class TPTInterrupt {
	 private Thread thread;
	 public void start(){
		 thread = new Thread(() -> {
			 while(true) {
				 Thread current = Thread.currentThread();
				 if(current.isInterrupted()) {
				 log.debug("料理后事");
				 break;
		 	 }
			 try {
				 Thread.sleep(1000);
				 log.debug("将结果保存");
			 } catch (InterruptedException e) {
			 	 current.interrupt();
			 }
			 // 执行监控操作 
		 }
		},"监控线程");
		 thread.start();
	}
	public void stop() {
		 thread.interrupt();
	}
}

调用

TPTInterrupt t = new TPTInterrupt();
t.start();
Thread.sleep(3500);
log.debug("stop");
t.stop();

结果

11:49:42.915 c.TwoPhaseTermination [监控线程] - 将结果保存
11:49:43.919 c.TwoPhaseTermination [监控线程] - 将结果保存
11:49:44.919 c.TwoPhaseTermination [监控线程] - 将结果保存
11:49:45.413 c.TestTwoPhaseTermination [main] - stop 
11:49:45.413 c.TwoPhaseTermination [监控线程] - 料理后事



三、 利用停止标记

// 停止标记用 volatile 是为了保证该变量在多个线程之间的可见性
// 我们的例子中,即主线程把它修改为 true 对 t1 线程可见
class TPTVolatile {
	 private Thread thread;
	 private volatile boolean stop = false;
	 public void start(){
		 thread = new Thread(() -> {
			 while(true) {
				 Thread current = Thread.currentThread();
				 if(stop) {
				 log.debug("料理后事");
				 break;
			 }
			 try {
				 Thread.sleep(1000);
				 log.debug("将结果保存");
			 } catch (InterruptedException e) {
			 	//处理异常
			 }
			 // 执行监控操作
			 }
		 },"监控线程");
		 thread.start();
	 }
	 public void stop() {
		 stop = true;
		 thread.interrupt();
	 }
}

调用

TPTVolatile t = new TPTVolatile();
t.start();
Thread.sleep(3500);
log.debug("stop");
t.stop();

结果

11:54:52.003 c.TPTVolatile [监控线程] - 将结果保存
11:54:53.006 c.TPTVolatile [监控线程] - 将结果保存
11:54:54.007 c.TPTVolatile [监控线程] - 将结果保存
11:54:54.502 c.TestTwoPhaseTermination [main] - stop 
11:54:54.502 c.TPTVolatile [监控线程] - 料理后事



版权声明:本文为weixin_43125873原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。