中断线程

2025 年 3 月 28 日 | 阅读 2 分钟

如果任何线程处于休眠或等待状态(即,调用了 sleep() 或 wait()),则在线程上调用 interrupt() 方法会中断休眠或等待状态,并抛出 InterruptedException。如果线程未处于休眠或等待状态,则调用 interrupt() 方法会执行正常行为,并且不会中断线程,但会将中断标志设置为 true。让我们首先查看 Thread 类为线程中断提供的方法。

Thread 类提供的用于中断线程的 3 种方法

  • public void interrupt()
  • public static boolean interrupted()
  • public boolean isInterrupted()

中断线程停止工作的例子

在本例中,中断线程后,我们将传播它,因此它将停止工作。如果我们不想停止线程,我们可以在调用 sleep() 或 wait() 方法的地方处理它。让我们首先看一个传播异常的例子。

TestInterruptingThread1.java

立即测试

输出

Exception in thread-0  
       java.lang.RuntimeException: Thread interrupted...
       java.lang.InterruptedException: sleep interrupted
       at A.run(A.java:7)

中断线程不停止工作的例子

在本例中,中断线程后,我们处理了异常,因此它将中断休眠但不会停止工作。

TestInterruptingThread2.java

立即测试

输出

Exception handled  
       java.lang.InterruptedException: sleep interrupted
       thread is running...

中断线程行为正常的例子

如果线程未处于休眠或等待状态,则调用 interrupt() 方法将中断标志设置为 true,Java 程序员稍后可以使用该标志来停止线程。

TestInterruptingThread3.java

立即测试

输出

1
       2
       3
       4 
       5

isInterrupted 和 interrupted 方法怎么样?

isInterrupted() 方法返回中断标志,即 true 或 false。静态 interrupted() 方法在返回中断标志后将其设置为 false(如果为 true)。

TestInterruptingThread4.java

立即测试

输出

Code for interrupted thread
       code for normal thread
       code for normal thread
       code for normal thread