Java 中 interrupt 的作用及示例
在 Java 中,interrupt 方法用于中断线程的执行,主要有以下几个作用:
- 中断标志:调用
interrupt()方法会设置线程的中断标志。这意味着线程在下次调用Thread.interrupted()或isInterrupted()时,会检测到中断状态。 - 中断阻塞操作:如果线程在执行阻塞操作(如
wait()、sleep()或join())时被中断,这些方法会抛出InterruptedException,使线程能够通过捕获异常来清理资源或执行其他逻辑。 - 中断检测:在长时间运行的操作中,线程可以定期检查自己的中断状态,以便在被请求中断时及时停止操作。例如,可以在循环中使用
Thread.currentThread().isInterrupted()来判断是否需要提前退出。 - 中断与响应:中断是一种协作机制,线程必须自己响应中断请求。它不会强制终止线程,而是需要线程自己处理被中断的情况。
示例代码
下面是一个简单的代码示例,演示了如何使用 interrupt 方法:
java
复制代码
class InterruptExample extends Thread {
@Override
public void run() {
try {
while (!isInterrupted()) {
System.out.println("Thread is running...");
// 模拟工作
Thread.sleep(1000);
}
} catch (InterruptedException e) {
System.out.println("Thread was interrupted, exiting...");
// 处理中断的逻辑
}
}
}
public class Main {
public static void main(String[] args) throws InterruptedException {
InterruptExample thread = new InterruptExample();
thread.start();
// 主线程休眠2秒,然后中断子线程
Thread.sleep(2000);
thread.interrupt();
// 等待子线程结束
thread.join();
System.out.println("Main thread finished.");
}
}
在这个示例中,InterruptExample 线程会每秒打印一次信息。当主线程在2秒后调用 interrupt() 时,子线程会捕获 InterruptedException,执行清理逻辑,最终退出。通过这种方式,Java 提供了灵活的机制来管理线程的执行状态和响应中断请求。