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