目录  
 一、两阶段终止模式说明 二、错误思路 三、实现思路图 四、实现思路 五、方法说明 六、interrupt实现  
      七、volatile实现  
       
 
 1.在一个线程t1中优雅地终止另一个线程t2,指终止t2线程前,让t2线程有一个料理后事的机会  1.使用线程对象的stop方法停止线程  2.stop方法会真正杀死线程,如果线程锁住了共享资源,杀死该线程后再也没有机会释放锁,其它线程将永远无法获取锁  3.使用System.exit(int)方法停止线程  4.如果只想停止某个线程,System.exit方法会让整个程序都停止 
 
 1.while(true)死循环  2.判断有没有被打断,如果被打断,料理后事,结束循环  3.如果没有被打断,睡眠2秒,睡眠期间没有异常,执行操作,继续循环  4.睡眠期间有异常,设置打断标记,抓住异常,并重置打断标记,继续循环,判断被打断了,料理后事,结束循环 1.isInterrupted() 判断是否被打断,不会清除打断标记 2.interrupt() 打断线程,如果被打断的线程正在sleep、wait、join会导致被打断的线程抛出InterruptedException异常,并清除打断标记;如果被打断正在运行的线程,则会设置打断标记;park的线程被打断也会设置打断标记 3.interrupted() 判断当前线程是否被打断,会清除打断标记 package com.learning.interrupt;
import lombok.extern.slf4j.Slf4j;
/**
 * @Description 两阶段终止模式
 */
@Slf4j
public class TwoPhaseTermination {
    // 监控线程
    private Thread monitorThread;
    // 启动监控线程
    public void start(){
        monitorThread = new Thread(()->{
            while(true){
                Thread thread = Thread.currentThread();
                if(thread.isInterrupted()){
                    log.info("料理后事");
                    break;
                }
                try {
                    // 睡眠期间被打断
                    Thread.sleep(1000);
                    // 执行监控操作被打断
                    log.info("执行监控操作");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    // 重新设置打断标记 为true
                    thread.interrupt();
                }
            }
        });
        monitorThread.start();
    }
    // 停止监控线程
    public void stop(){
        monitorThread.interrupt();
    }
    public static void main(String[] args) throws InterruptedException {
        TwoPhaseTermination twoPhaseTermination = new TwoPhaseTermination();
        twoPhaseTermination.start();
        Thread.sleep(3500);
        twoPhaseTermination.stop();
    }
}
 
package com.learning.interrupt;
import lombok.extern.slf4j.Slf4j;
/**
 * @Author Jun.Wang
 * @Date 2023/5/25 14:32
 * @Description 两阶段终止模式 volatile
 */
@Slf4j
public class TwoPhaseTermination_Volatile {
    // 监控线程
    private Thread monitorThread;
    private volatile boolean stop;
    // 启动监控线程
    public void start(){
        monitorThread = new Thread(()->{
            while(true){
                if(this.stop){
                    log.info("料理后事");
                    break;
                }
                try {
                    // 睡眠期间被打断
                    Thread.sleep(1000);
                    // 执行监控操作被打断
                    log.info("执行监控操作");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        monitorThread.start();
    }
    // 停止监控线程
    public void stop(){
        this.stop = true;
        monitorThread.interrupt();
    }
    public static void main(String[] args) throws InterruptedException {
        TwoPhaseTermination_Volatile twoPhaseTermination = new TwoPhaseTermination_Volatile();
        twoPhaseTermination.start();
        Thread.sleep(3500);
        twoPhaseTermination.stop();
    }
}