原创

线程中断机制

温馨提示:
本文最后更新于 2025年06月02日,已超过 376 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

中断机制

一个线程不应该由其他线程来强制 中断或停止,而是应由线程自己自行停止。所以,Thread.stop\Thread.suspend\Thread.resume被废弃


Java中没有办法立即停止一个线程,然而停止线程确实尤为重要,如:取消耗时操作。Java提供了一种停止线程的协商机制-中断,也即中断协商机制


中断只是一种协商机制,Java没有给中断增加任何方法,中断的过程需要程序员自己实现


若要中断一个线程,需要手动调用该线程的interrupt方法,该方法也仅仅是将线程对象的中断标识设成true;接着需要自己写代码检测当前线程的标识位,如果为true,表示别的线程请求这个线程中断。


每个对象中都有一个中断标识 位,用于表示线程是否被中断。该标识位为true表示中断,为false表示未中断。通过调用线程对象的interrupt方法将该线程的标识位设为true;可以在别的线程中调用,也可以在自己的线程中调用。

中断的相关API方法之三大方法说明

  • interrupt()

实例方法,仅仅是设置线程的中断状态为true,发起一个协商而不会立刻停止线程

底层是 调用 native的interrupt0 方法

中断 不活动的线程不产生任何影响

如果线程处于被阻塞状态(例如 sleep、wait、join等状态),在别的线程中调用当前线程对象的interrupt方法,那么线程立即退出被阻塞状态,并抛出一个InterruptException异常

  • demo   没有 Thread.currentThread().interrupt(); 二次设置中断状态,程序将进入死循环
  Thread t1 = new Thread(() -> {
            while (true) {
                if (Thread.currentThread().isInterrupted()) {
                    System.out.println("程序停止");
                    break;
                }
                try {
                    TimeUnit.MILLISECONDS.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    Thread.currentThread().interrupt();
                }

                System.out.println("程序运行中……");
            }
        }, "t1");
        t1.start();

        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

        new Thread(() -> {
            t1.interrupt();
        }, "t2").start();
  • interrupted()

判断线程是否被中断并清除当前中断状态

  1. 返回当前线程的中断状态,测试当前线程是否已被中断
  2. 将当前线程的中断状态清零并重新设置为true,清除线程的中断状态

isInterrupted()

判断当前线程是否被中断  true 希望被中断 

中断运行中的线程

  • 通过一个volatile变量实现

定义变量

 static volatile boolean isstop = false;

示例

        new Thread(() -> {
            while (true) {
                if (isstop) {
                    System.out.println("程序停止");
                    break;
                }
                System.out.println("程序运行中……");
            }
        }, "t1").start();
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

        new Thread(() -> {
            isstop = true;
        }, "t2").start();
  • 通过AtomicBoolean实现

定义原子变量

 static volatile AtomicBoolean isStopMark = new AtomicBoolean(false);

示例

new Thread(() -> {
            while (true) {
                if (isStopMark.get()) {
                    System.out.println("程序停止");
                    break;
                }
                System.out.println("程序运行中……");
            }
        }, "t1").start();
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

        new Thread(() -> {
            isStopMark.set(true);
        }, "t2").start();
  • 通过Thread类自带的中断api实例方法实现

在需要中断的线程中 不断监听中断状态,一旦发生中断,就执行相应的中断处理业务逻辑stop线程

示例

 Thread t1 = new Thread(() -> {
            while (true) {
                if (Thread.currentThread().isInterrupted()) {
                    System.out.println("程序停止");
                    break;
                }
                System.out.println("程序运行中……");
            }
        }, "t1");
        t1.start();

        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

        new Thread(() -> {
            t1.interrupt();
        }, "t2").start();


中断标识为true,线程是否立刻停止



静态方法 Thread.Interrupted() 理解


 












正文到此结束