两阶段终止模式

两阶段终止模式

什么是两阶段终止模式

  • 核心:[实现正在运行的线程可以被其余线程优雅的终止]{.red}

细节:之前已经借助了中断方法实现了优雅的中断线程,现在将这种中断方式抽象成一种模式来实现

为什么要使用两阶段终止模式

  • 情景:线程之间需要相互通信协作的时候,会出现某些线程想要终止其他线程的情况

  • 方式:

    • stop() 方法

      • 前提:[Stop 方法在 JDK 中已经内废弃了]{.gray}

      • 作用:[强制性杀死需要中断的线程,无论线程自身是否想要被终止]{.red}

      • 缺陷:[被杀死的线程不会释放持有的资源的锁]{.aqua}

        :::info

        因为线程被杀死,所以它之后也没有机会再释放锁,其余线程也永远无法获取这把锁

        :::

    • System.exit(1)方法

      • 作用:[直接结束整个进程]{.red}
      • 缺陷:[导致不想要被中断的线程也被一起中断,显然是非常不好的]{.aqua}

如何实现两阶段终止模式

  • 步骤:

    1. 被监视的线程需要提供相应的开始和结束的方法:

      • 抽象成类

        // 设计模式: 两阶段终止模式
        @Slf4j(topic = "c.TwoPhaseTermination")
        public class TwoPhaseTermination{
        // 被监视的线程
        private Thread monitor;
        }
      • 实现开始和结束方法

        // 设计模式: 两阶段终止模式
        @Slf4j(topic = "c.TwoPhaseTermination")
        public class TwoPhaseTermination{
        private Thread monitor;
        // 启动线程的方法
        private void start(){
        monitor = new Thread(()->{
        while (true){
        if (monitor.isInterrupted())
        break;
        try {
        TimeUnit.SECONDS.sleep(1);
        log.debug("线程正常运行...");
        }
        catch (InterruptedException e) {
        e.printStackTrace();
        // 重新设置中断标记
        monitor.interrupt();
        }
        }
        });
        monitor.start();
        }

        // 停止线程
        private void stop(){
        // 中断线程
        monitor.interrupt();
        }
        }
    2. 监视线程只需要调用开始结束方法就可以很容易地控制该线程

      // 设计模式: 两阶段终止模式
      @Slf4j(topic = "c.TwoPhaseTermination")
      public class TwoPhaseTermination{
      // 让线程一可以终止线程二的方式
      public static void main(String[] args) throws InterruptedException
      {
      TwoPhaseTermination tpt = new TwoPhaseTermination();
      tpt.start();
      TimeUnit.SECONDS.sleep(5);
      tpt.stop();
      log.debug("线程运行结束...");

      }
      }
Author: Fuyusakaiori
Link: http://example.com/2021/11/04/juc/设计模式/两阶段终止模式/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.