概述
interrupted()
和 isInterrupted()
是 Java 中 Thread
类提供的两个方法,用于处理线程中断。
interrupted() 方法
interrupted()
方法检查当前线程是否已被中断,并在中断的情况下清除中断标志。如果线程已被中断,则 interrupted()
方法返回 true
,否则返回 false
。
isInterrupted() 方法
isInterrupted()
方法仅检查当前线程是否已被中断,但不会清除中断标志。如果线程已被中断,则 isInterrupted()
方法返回 true
,否则返回 false
。
区别
interrupted()
和 isInterrupted()
方法之间的主要区别在于,interrupted()
方法会清除中断标志,而 isInterrupted()
方法不会。
使用场景
使用 interrupted()
方法:
- 当需要在中断线程后立即执行某些操作时,例如清理资源或关闭连接。
- 当需要重置中断标志,以便线程可以继续执行时。
使用 isInterrupted()
方法:
- 当需要检查线程是否已被中断,但不需要执行任何后续操作时。
- 当需要在循环或条件语句中多次检查中断标志时。
示例
以下示例演示了 interrupted()
和 isInterrupted()
方法之间的区别:
public class ThreadInterruption {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
while (!Thread.interrupted()) {
// 执行任务
}
System.out.println("线程已被中断!");
});
thread.start();
// 线程启动后,中断它
thread.interrupt();
// 检查线程是否已被中断
boolean interrupted = thread.isInterrupted();
System.out.println("线程是否已被中断?" + interrupted);
// 清除中断标志并检查是否清除
interrupted = thread.interrupted();
System.out.println("中断标志是否已清除?" + !interrupted);
}
}
在这个示例中,isInterrupted()
方法用于检查线程是否已被中断,而 interrupted()
方法用于清除中断标志。
最佳实践
使用 interrupted()
和 isInterrupted()
方法时,应遵循以下最佳实践:
- 避免在循环或条件语句中使用
interrupted()
方法:这可能会导致意外的中断和不确定的行为。 - 在处理中断后,使用
interrupted()
方法清除中断标志:这将允许线程继续执行,并避免在后续检查中出现意外结果。 - 仅在需要时中断线程:中断线程会强制线程停止执行,因此应谨慎使用。
总结
interrupted()
和 isInterrupted()
方法是用于处理线程中断的两个重要方法。interrupted()
方法检查并清除中断标志,而 isInterrupted()
方法仅检查中断标志。通过理解这些方法之间的区别并遵循最佳实践,可以有效地处理多线程应用程序中的中断。