如何理解 Java 中的线程中断机制?

线程中断是 Java 多线程编程中一种重要的机制,它提供了一种让一个线程请求另一个线程停止执行的方式。这种机制并不是强制性的,而是一种协作式的方式。当一个线程想要中断另一个线程时,实际上是给那个线程设置一个中断标志,表示希望它停止执行。被中断的线程需要定期检查这个标志,并决定是否响应中断请求。

在 Java 中,可以使用以下方法来处理线程中断:

  1. Thread.interrupt():这是一个实例方法,用于向目标线程发送中断请求。当调用这个方法时,会将目标线程的中断标志设置为 true。

  2. Thread.isInterrupted():这是一个实例方法,用于检查目标线程的中断标志是否被设置。如果线程已经被中断,该方法将返回 true。

  3. Thread.interrupted():这是一个静态方法,用于检查当前线程是否被中断。与 isInterrupted() 不同的是,这个方法在返回中断状态的同时还会清除中断标志(将其设置为 false)。

要理解线程中断,我们可以看一个简单的例子。假设我们有一个线程,它会无限循环地执行一些任务。我们希望在某个时刻停止这个线程。代码如下:

class MyRunnable implements Runnable {
    @Override
    public void run() {
        while (!Thread.currentThread().isInterrupted()) {
            // 执行任务
        }
        System.out.println("线程已中断");
    }
}

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Thread myThread = new Thread(new MyRunnable());
        myThread.start();

        // 主线程休眠 5 秒,让 myThread 有时间执行任务
        Thread.sleep(5000);

        // 中断 myThread 线程
        myThread.interrupt();
    }
}

在这个例子中,我们创建了一个名为 MyRunnable 的线程类。在 run() 方法中,我们使用一个 while 循环来模拟无限循环任务。循环条件是检查当前线程是否被中断。在主方法中,我们启动 myThread 线程,让它运行 5 秒钟,然后调用 myThread.interrupt() 向它发送中断请求。当 myThread 检测到中断标志时,它会跳出循环并结束执行。

发表评论

后才能评论