【问题标题】:When an Thread.interrupt() is called on some thread, what happens? [duplicate]当在某个线程上调用 Thread.interrupt() 时,会发生什么? [复制]
【发布时间】:2011-01-18 09:27:01
【问题描述】:

当在某个线程上调用Thread.interrupt() 时,该线程会发生什么?

【问题讨论】:

标签: java multithreading interrupt


【解决方案1】:

目标线程被“中断”。大多数情况下,该线程中设置了一个标志,该线程可以查看该标志(使用Thread.interrupted())。如果目标线程当前在某些 I/O 或 Object.wait() 上被阻塞,则它会分别被 InterruptedIOExceptionInterruptedException 唤醒。

线程中断是一种轻推线程的温和方式。它用于让线程有机会干净地退出,而不是Thread.stop(),这更像是用突击步枪射击线程。

【讨论】:

  • InterruptedIOException 不太可能是练习。 Solaris 中短暂启用了可中断 I/O,但这并不值得。当然,实现是特定于实现的。通常(最近)操作系统将与线程有关。
  • +1 自己解释和拍摄对比。
【解决方案2】:

Javadoc for that method 解释了在什么情况下会发生什么。

【讨论】:

    【解决方案3】:

    这里是 JDK 1.6 Javadoc:

    中断这个线程。

    除非当前线程是 中断自己,这总是 允许, checkAccess 方法 调用此线程,这可能 导致 SecurityException 为 扔了。

    如果这个线程在一个 调用 wait(), wait(long), 或 wait(long, int) 的方法 对象类,或 join(), 加入(长),加入(长,整数), 睡眠(长),或睡眠(长,整数), 这个类的方法,然后它的 中断状态将被清除并 它将收到一个 中断异常。

    如果此线程在 I/O 中被阻塞 可中断操作 频道 那么频道将是 关闭,线程的中断状态 将被设置,线程将 收到 ClosedByInterruptException。

    如果这个线程在一个 选择器然后线程的中断 将设置状态并将返回 立即从选择 操作,可能有一个非零 值,就像选择器的 唤醒方法被调用。

    如果没有上述条件 保持然后这个线程的中断 状态将被设置。

    中断一个不是 活着不需要任何效果。

    【讨论】:

      【解决方案4】:

      ZeissS 是正确的,信号是最干净的方式。您还可以捕获中断异常并以这种方式进行清理。

      【讨论】:

        猜你喜欢
        • 2019-10-22
        • 2013-10-13
        • 1970-01-01
        • 2017-02-14
        • 1970-01-01
        • 2014-08-31
        • 2013-06-09
        • 2014-03-18
        • 1970-01-01
        相关资源
        最近更新 更多