【问题标题】:What happens when you invoke a thread's interrupt()?当您调用线程的中断()时会发生什么?
【发布时间】:2010-12-06 22:26:21
【问题描述】:

我需要知道会发生什么

  1. 什么时候睡觉?
  2. 当它运行时,即它正在执行给定的任务。

提前致谢。

【问题讨论】:

    标签: java multithreading thread-safety


    【解决方案1】:

    中断一个线程是一种状态安全的方式来取消它,但是线程本身必须被编码来注意中断。如果在该线程执行时发生.interrupt(),则抛出InterruptedException 的长阻塞Java 操作将抛出该异常。

    .interrupt() 方法为该线程设置“中断”标志并中断任何 IO 或睡眠操作。它什么都不做,因此由您的程序做出适当响应并定期通过Thread.interrupted() 检查其中断标志。

    如果一个线程不检查中断,它就不能安全地停止。 Thread.stop() is unsafe to use. 所以你使用.interrupt() 来停止一个线程,但是在编写多线程代码时,你要确保.interrupt() 会做一些明智的事情。 This TechRepublic article is a pretty good tutorial.

    【讨论】:

    • 嗨,亚当, 我认为 “如果在线程运行时发生 .interrupt(),那么长时间阻塞抛出 InterruptedException 的 Java 操作将抛出该异常执行” 是另一种方式。你说一个线程正在阻塞 那是因为:1)它已经休眠了一段时间 2)它通过调用suspend()被挂起,并且将被阻塞,直到resume() 消息 3) 线程通过调用 wait() 被挂起,并且将在 notify 或 notifyAll 消息上变得可运行。在上述所有这些情况下,线程没有执行它处于阻塞状态的任何内容。当int
    【解决方案2】:

    从您之前的问题来看,我假设您对 Java 的行为感兴趣。

    在 Java 中,如果线程当前处于阻塞状态,则会抛出 InterruptedException。如果线程没有阻塞,则不会抛出异常。

    更多信息,请看这里:
    JavaDocs

    对于 .NET 语言,如果线程当前处于阻塞状态,则会抛出 ThreadInterruptedException。如果线程没有阻塞,则在线程阻塞之前不会抛出异常。

    请用您想要回答的语言标记您的问题。

    【讨论】:

    • Java 中的类似情况,不同之处在于 (1) 异常被称为 InterruptedException,以及 (2) 线程具有“中断状态”,如果线程未等待或休眠,则设置该“中断状态”。我不确定中断状态已经设置的阻塞是否会导致抛出异常,但它是不太可能破坏东西的选择。
    【解决方案3】:

    还有一个值得分享的重要信息是,Thread Class 中有两个方法 isInterrupted()interrupted()。后者是一种静态方法。 isInterrupted()方法调用不会改变Thread类的interrupted属性的状态,而interrupted()静态方法调用可以设置中断布尔值为假

    【讨论】:

      猜你喜欢
      • 2016-11-29
      • 2019-01-13
      • 2019-10-22
      • 2013-10-13
      • 1970-01-01
      • 2012-02-12
      • 2017-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多