背景:一般的线程不需要我们去终止,正常的线程会在代码执行完毕之后自动的退出。但是一些特殊的线程,比如一个一直需要监视一个系统的业务逻辑的线程,我们现在需要手动的停掉监控线程,这时我们就可以让线程退出。

方法1(常用的方法):使用标志字段,在线程的外面使用一个循环嵌套住,接着在主线程中修改标志字段。但是需要使用volatile关键字对字段修饰(volatile的作用是:1.防止指令乱序。2.对于写操作,能够将修改立刻刷回主存中,并且让缓存中的值全部处于无效状态,线程想使用只能从内存加载;一句话就是可以防止线程发生可见性问题)

方法2:使用线程的interrupt()方法中断线程的执行,这个也很简单就是利用Thread.sleep,以及锁的wait()方法在使用的情况下可能会被其他线程唤醒的异常,我们可以对异常捕获;


public class ExitThread {
    //线程的退出:1.使用标志位对线程是否继续执行进行限制,这个标志位可以是0,1也可以是true或者是false;
    // 2.可以使用interrupt中断线程;也即是使用之前的interrupt
    //方法将线程终止掉;
    
    public volatile static boolean flag = true;
    //public static ThreadLocal<Boolean> threadLocal = new ThreadLocal<>();//泛型类型必须是包装类不能是基础数据类型
    //有时存在着这样的需求,比如我们需要对一个线程执行循环操作,但是执行到一定的任务时就需要停下来;
    //可以使用修改循环的标志位的方式使得线程停下来,但是不能直接修改
    public static void main(String[] args) throws InterruptedException {
        new Thread(()->{
            while (flag) {
                System.out.println("t1");//此处存在代码块,所以被注释的方式才会有机会将flag刷回到主存中;

            }

        }).start();

        Thread.sleep(2000);
        flag = false;

    }
}