【问题标题】:Why does Thread.isInterrupted () always return false?为什么Thread.isInterrupted()总是返回false?
【发布时间】:2011-08-22 02:39:19
【问题描述】:

我找到了JavaDoc的方法:

返回: 如果此线程已被中断,则为 true;否则为假。

我认为我对方法的理解有问题。此外,我可能会误解 Thread 中的“中断”概念。

欢迎任何解释!谢谢!

代码sn-p:

在线程定义中:

public void run() {
        try {
            //Do something
        } catch (InterruptedException e) {
            System.out.println(isInterrupted());//Always false
            return;
        }
    }

调用:

theThread.interrupt();

【问题讨论】:

    标签: java multithreading concurrency


    【解决方案1】:

    此行为通常记录在引发该异常的方法中。例如,Object.wait() 的 javadoc 说:

    "InterruptedException - 如果任何线程在当前线程等待通知之前或期间中断了当前线程。抛出此异常时清除当前线程的中断状态。强>"

    确实,异常本身的 javadoc 是这样说的:

    "偶尔有一个方法可能希望测试当前线程是否被中断,如果是,立即抛出这个异常。下面的代码可以达到这个效果:

    if (Thread.interrupted())  // Clears interrupted status!
         throw new InterruptedException();
    

    注意他们如何强调标志应该在抛出异常之前被清除。


    为什么设计成这样工作?您必须询问设计人员,但我希望他们认为异常处理程序应该处理这种情况,因此此时不需要设置标志。 (如果处理程序没有完全处理这种情况,它可以重新抛出异常,或者调用Thread.getCurrentThread.interrupt() 再次设置标志。)

    【讨论】:

      【解决方案2】:

      一旦抛出异常,线程就不再处于中断状态。

      【讨论】:

      • 抛出异常时,清除当前线程的中断状态。来自文档:“InterruptedException - 如果任何线程中断了当前线程。抛出此异常时,当前线程的中断状态将被清除。” rejected suggested editsource
      • 线程不再处于中断状态,除非/直到它再次被中断。 catch 块中的isInterrupted 可以为真。
      【解决方案3】:

      添加到 cdhowie 的答案中,一种标准模式是让线程处理中断。这对Executors 很有用,当正在运行的代码不“拥有”线程并且不应该妨碍中断时(除非你真的知道自己在做什么)

      public void run() {
          try {
              //Do something
          } catch (InterruptedException e) {
              // Do whatever local clean up you need to
              ...
              // Then let the owning Thread know it's been interrupted, so it too can clean up
              Thread.currentThread().interrupt(); // 
          }
      }
      

      【讨论】:

        【解决方案4】:

        您可以在自己的代码中检查 isInterrupted(),例如在循环中。如果线程被中断,你可以抛出 InterruptedException 来停止执行。

        在您的示例中,如果您捕获了 InterruptedException,则可以确定它已被中断,并且您不必检查该方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多