面试突击 26(如何正确停止线程())

在 Java 中停止线程的实现方法有以下 3 种:

  1. 自定义中断标识符,停止线程。
  2. 使用线程中断方法 interrupt 停止线程。
  3. 使用 stop 停止线程。
【面试突击 26(如何正确停止线程())】其中 stop 方法为 @Deprecated 修饰的过期方法,也就是不推荐使用的过期方法,因为 stop 方法会直接停止线程,这样就没有给线程足够的时间来处理停止前的保存工作,就会造成数据不完整的问题,因此不建议使用。而自定义中断标识也有一些问题,所以综合来看,interrupt 方法才是最理想的停止线程的方法,接下来我们一起来看它们的具体差异。
1.自定义中断标识符 自定义中断标识符就是在程序中定义一个变量来决定线程是否要中断执行,具体实现代码如下:
class FlagThread extends Thread { // 自定义中断标识符 public volatile boolean isInterrupt = false; @Override public void run() { // 如果为 true -> 中断执行 while (!isInterrupt) { // 业务逻辑处理 } } }

但自定义中断标识符的问题在于:线程中断的不够及时。因为线程在执行过程中,无法调用 while(!isInterrupt) 来判断线程是否为终止状态,它只能在下一轮运行时判断是否要终止当前线程,所以它中断线程不够及时,比如以下代码:
class InterruptFlag { // 自定义的中断标识符 private static volatile boolean isInterrupt = false; public static void main(String[] args) throws InterruptedException { // 创建可中断的线程实例 Thread thread = new Thread(() -> { while (!isInterrupt) { // 如果 isInterrupt=true 则停止线程 System.out.println("thread 执行步骤1:线程即将进入休眠状态"); try { // 休眠 1s Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("thread 执行步骤2:线程执行了任务"); } }); thread.start(); // 启动线程// 休眠 100ms,等待 thread 线程运行起来 Thread.sleep(100); System.out.println("主线程:试图终止线程 thread"); // 修改中断标识符,中断线程 isInterrupt = true; } }

以上代码的执行结果如下图所示:
面试突击 26(如何正确停止线程())
以上代码的执行结果如下图所示:
面试突击 26(如何正确停止线程())

    推荐阅读