线程中断是 Java 中的一种协作机制,用于通知线程应该停止当前工作并退出。
中断就好比其它线程跟当前线程打了个招呼,告诉他可以执行中断操作。其他线程通过调用该线程的interrupt()
方法对其进行中断操作。
中断并不会直接终止线程,而是设置了这个线程的中断状态,线程需要自己检查这个状态并决定如何响应。
常用的方法
interrupt()
:方法会将目标线程的中断状态设置为 true
。
interrupted()
:这是一个静态方法,会清除当前线程的中断状态,并返回中断状态的值。
isInterrupted()
:这是一个实例方法,不会改变线程的中断状态,仅返回当前状态。
某些阻塞方法(如Thread.sleep()
、Object.wait()
、BlockingQueue.take()
等)在检测到线程被中断时会抛出InterruptedException
,并自动重置中断状态为false
。此时调用isInterrupted()
方法将会返回false
。
线程自身处理中断
线程接收到中断信号后,具体的行为完全由线程自身决定。例如:
- 可以选择立即退出。
- 可以执行一些清理操作后再退出。
- 也可以忽略中断信号继续运行。
以下是一个线程中断的示例:
csharp
public class InterruptExample {
public static void main(String[] args) throws InterruptedException {
Thread worker = new Thread(() -> {
while (true) {
if (Thread.currentThread().isInterrupted()) {
System.out.println("线程被中断,准备退出...");
break;
}
try {
Thread.sleep(1000); // 模拟耗时任务
} catch (InterruptedException e) {
System.out.println("捕获到中断异常,设置中断状态...");
Thread.currentThread().interrupt(); // 恢复中断状态
}
System.out.println("线程正在运行...");
}
});
worker.start();
// 主线程等待2秒后中断worker线程
Thread.sleep(2000);
worker.interrupt();
System.out.println("主线程已发送中断信号...");
// 等待worker线程结束
worker.join();
System.out.println("worker线程已结束");
}
}
总结
中断不是强制终止:中断只是发送一个信号,线程需要自己检查并响应。
对目标线程调用interrupt()
可以请求中断一个线程,目标线程通过调用isInterrupted()
标志获取自身是否已中断。如果目标线程处于等待状态,会抛出InterruptedException
。
目标线程调用isInterrupted()
为true
或者捕获了InterruptedException
,需要自行处理是否结束当前任务。