关于线程的终止,我们有两种方法来实现
1.使用一个标志位
private static boolean flag = true; public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(() -> { while (flag) { System.out.println("你好"); } }); //t.start(); t1.start(); Thread.sleep(2000); flag = false; }
细节:为什么这个变量需要定义在类中方法外,且为static呢?
原因:使用lambda表达式时,会触发变量捕获,表达式内的变量都不允许发生改变,所以要在类中方法外定义
关于static:静态区的属性存储在静态区 类中的变量存储在栈上 故static修饰的变量不会受此影响(本人猜测,如有不妥,还请更正)
2.使用isInterrupted()方法
使用interrupt方法可以将线程中的isInterrupted()标志位变成true
重点:当终止线程时,线程刚好在休眠状态,那么此时会有两个变化
1.线程即刻被唤醒
2.触发sleep内部的异常,程序不会终止, 且将isInterrupted()标志位变成false
将标志位重新变成false意味着什么呢?
意味着此线程即使报出了异常,但还是依然继续允许,且接下来需要怎么操作,如何操作,都是由程序员代码实现的
1.请求被忽略
2.线程t马上响应终止请求