java.lang.Thread.interrupt() 是做什么的?

2022-08-31 05:29:38

您能解释一下调用时会做什么吗?java.lang.Thread.interrupt()


答案 1

Thread.interrupt()设置目标线程的中断状态/标志。然后,在该目标线程中运行的代码可以轮询中断状态并对其进行适当的处理。某些阻止的方法,例如可能会立即消耗中断状态并引发适当的异常(通常Object.wait()InterruptedException)

Java中的中断不是先发制人的。换句话说,两个线程必须合作才能正确处理中断。如果目标线程不轮询中断状态,则中断将被有效地忽略。

轮询通过该方法进行,该方法返回当前线程的中断状态并清除该中断标志。通常,线程可能会执行某些操作,例如 throw InterruptedException。Thread.interrupted()

编辑(来自 Thilo 注释):某些 API 方法内置了中断处理功能。在我的头顶上,这包括。

  • Object.wait()Thread.sleep()Thread.join()
  • 大多数结构java.util.concurrent
  • Java NIO(但不是 java.io),它不使用 ,而是使用 。InterruptedExceptionClosedByInterruptException

编辑(来自@thomas-pornin完全相同问题的完整性的回答)

线程中断是微移线程的温和方法。它用于给线程一个干净退出的机会,而不是像用突击步枪射击线程。Thread.stop()


答案 2

什么是中断?

中断是线程的指示,指示它应该停止它正在执行的操作并执行其他操作。由程序员决定线程如何响应中断,但线程终止是很常见的。

它是如何实现的?

中断机制是使用称为中断状态的内部标志实现的。调用 Thread.interrupt 将设置此标志。当线程通过调用静态方法 Thread.interrupted 来检查中断时,将清除中断状态。非静态 Thread.isInterrupted(一个线程用于查询另一个线程的中断状态)不会更改中断状态标志。

引用自 Thread.interrupt() API

中断此线程。首先调用此线程的 checkAccess 方法,这可能会导致抛出 SecurityException。

如果在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者调用该类的 join()、join(long)、join(long、int)、sleep(long)或 sleep(long, int) 方法时阻塞此线程,则其中断状态将被清除,并且它将收到一个 InterruptedException。

如果此线程在可中断通道上的 I/O 操作中被阻塞,则该通道将关闭,线程的中断状态将被设置,并且该线程将收到 ClosedByInterruptException。

如果此线程在选择器中被阻塞,则将设置线程的中断状态,并且它将立即从选择操作返回,可能具有非零值,就像调用选择器的唤醒方法一样。

如果上述条件均不成立,则将设置此线程的中断状态。

查看此内容以完全了解相同内容:

http://download.oracle.com/javase/tutorial/essential/concurrency/interrupt.html