【问题标题】:What or who should interrupt a Thread?什么或谁应该中断一个线程?
【发布时间】:2012-07-13 05:30:20
【问题描述】:

根据 Goetz 在他的《JCIP》一书中:

因为每个线程都有自己的中断策略,所以除非您知道中断对线程意味着什么,否则不应中断线程。

那为什么Java 语言提供了public interrupt () 方法呢?这是设计缺陷吗?那么谁或什么应该中断一个线程呢?

【问题讨论】:

    标签: java java.util.concurrent


    【解决方案1】:

    他的意思是,如果你不知道一个线程做什么以及它是如何工作的,你就不应该打断它。由于所有线程都可以被中断,因此在类Thread 中有一个interrupt() 方法是合乎逻辑的。

    您可以对许多其他在错误位置执行时可能造成“伤害”的方法提出同样的问题。方法就是工具,程序员必须明智地使用这些工具才能创建正确运行的程序。

    【讨论】:

      【解决方案2】:

      我首先推荐你阅读Java Concurrency in Practice

      我想,这个question可以回答你提到的问题。

      顺便说一下,让我们看看如何防止线程。我们可以使用 Thread 类的 3 种方法中的任何一种来阻止线程执行:

      1. yield()
      2. join()
      3. sleep()
      1. yield() 方法会暂时暂停当前正在执行的线程,以便让具有相同优先级的剩余等待线程有机会执行。如果没有等待线程或所有等待线程的优先级较低,则同一线程将继续执行。产生的线程何时有机会执行由线程调度程序决定,其行为取决于供应商。

      2. join() 如果任何正在执行的线程 t1 在 t2 上调用 join(),即; t2.join() t1 将立即进入等待状态,直到 t2 完成执行。

      3. sleep()根据我们的要求,我们可以让线程在指定的时间内处于休眠状态。

      【讨论】:

      • 我不明白它是如何回答我的问题的。您提供了有关 yield()、join() 和 sleep 可以做什么的文字...我认为您的回答和我的问题是断开的,或者我是这里遗漏了什么?
      • 如果你不明白那里提到的内容,那么你需要学习更多。在我发现这个问题之前,我正要在回答中提到同样的问题。
      • 链接没问题,但您的答案第一段之后的所有内容都是不必要的,并且没有为我的问题增加任何价值。因此 -1。
      • -1 对我来说无关紧要,但我添加它只是为了增加一件事。希望认为它可能对某人有用。
      【解决方案3】:

      嗯,这绝不是缺陷。 (不过,Thread.stop() 等其他方法确实是)

      使Thread.interrupt()better 的原因在于,它仅在线程被阻塞/等待/休眠时才会影响线程。如果它正在运行interrupt()只要求线程停止这样做通过设置一个状态变量,可以通过Thread.interrupted()Thread.isInterrupted()查询

      通常,最好的方法是让线程从它们的run() 方法返回,而不是以任何方式在外部停止它们。

      void run() {
          while(!isInterrupted())
              //executed
      
      }
      

      注意Thread.interrupted(),因为它会清除中断状态。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-10
        • 2011-05-31
        • 2018-06-09
        • 1970-01-01
        • 1970-01-01
        • 2012-03-24
        • 1970-01-01
        • 2016-01-28
        相关资源
        最近更新 更多