如何理解 Java 中的线程中断机制?
线程中断是 Java 多线程编程中一种重要的机制,它提供了一种让一个线程请求另一个线程停止执行的方式。这种机制并不是强制性的,而是一种协作式的方式。当一个线程想要中断另一个线程时,实际上是给那个线程设置一个中断标志,表示希望它停止执行。被中断的线程需要定期检查这个标志,并决定是否响应中断请求。
在 Java 中,可以使用以下方法来处理线程中断:
Thread.interrupt()
:这是一个实例方法,用于向目标线程发送中断请求。当调用这个方法时,会将目标线程的中断标志设置为 true。-
Thread.isInterrupted()
:这是一个实例方法,用于检查目标线程的中断标志是否被设置。如果线程已经被中断,该方法将返回 true。 -
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
检测到中断标志时,它会跳出循环并结束执行。