thread.interrupt()如何设置标志?

时间:2014-02-28 19:24:35

标签: java multithreading interrupt runnable

来自docs:

中断状态标志

The interrupt mechanism is implemented using an internal flag known as the interrupt status. Invoking Thread.interrupt sets this flag. When a thread checks for an interrupt by invoking the static method Thread.interrupted, interrupt status is cleared. The non-static isInterrupted method, which is used by one thread to query the interrupt status of another, does not change the interrupt status flag. By convention, any method that exits by throwing an InterruptedException clears interrupt status when it does so. However, it's always possible that interrupt status will immediately be set again, by another thread invoking interrupt.

我阅读了这些SO个帖子。但我认为我没有正确理解这一点。所以我在下面的示例代码中对此进行了测试。 我有两个threads在这里运行。一个是main,另一个是Thread-0,标记为t

我致电t.interrupt(),并在Thread.currentThread().isInterrupted()方法中致电run。 旗帜到底在哪里? Thread Class是否维护当前正在运行的所有static list的{​​{1}},并且通过调用Threads我获取Thread.currentThread()对象并检查它是否被中断? 如果Thread类本身具有布尔标志currentThread,它如何区分两个线程;示例interruptedmainThread-0的{​​{1}}是否相同? 确切的步骤顺序是static flagThreadsset flag等在哪里?

当我look up下面unset flag的块(当前是c uncomment)时,程序永远不会停止。我不明白为什么?

code

2 个答案:

答案 0 :(得分:4)

  

当我取消注释下面的代码块时(目前已注释掉了)   out),程序永远不会停止。我不明白为什么?

请注意Thread#interrupt()

的javadoc
  

如果在调用 wait()时阻止此线程,则等待(long),   或者等待(long,int)Object类或join()的方法,   join(long),join(long,int), sleep(long),或sleep(long,int),方法   在这个类中,然后它的中断状态将被清除   收到InterruptedException。

因此,如果您取消注释代码,则会解除标记,并且if永远不会执行。

  

Thread Class是否维护所有Thread的静态列表   当前正在运行并调用Thread.currentThread()

Thread.currentThread()方法声明为(Oracle JDK 7)

public static native Thread currentThread();

换句话说,它本身是在C代码中实现的。我们可以假设,在给定javadoc的情况下,存储了对所有线程的引用。返回当前正在执行的那个。

同样,Thread#isInterrupted()方法调用

private native boolean isInterrupted(boolean ClearInterrupted);

也是本地实现的。但我们可以假设它使用了一些布尔样式的标志。

答案 1 :(得分:1)

  

旗帜到底在哪里?

JVM Thread对象跟踪标记。

  

线程类是否维护当前正在运行的所有线程的静态列表,并通过调用Thread.currentThread()获取currentThread对象并检查它是否被中断?

Thread 不会这样做,但JVM会这样做。 Thread.currentThread()是一个静态方法,它返回与调用线程关联的Thread对象。

  

如果Thread类本身的boolean标志被中断,它如何区分两个线程;示例main和Thread-0 here

这是一个实例字段而不是一个静态字段。它是每Thread个实例。

  

当我取消注释下面的代码块(当前被注释掉)时,程序永远不会停止。我不明白为什么?

因为当你中断线程时,Thread.sleep(...)会抛出InterruptedException,它会清除线程的中断标志。一旦捕获InterruptedException,就应该重新中断线程。

try {
     Thread.sleep(100);
} catch (InterruptedException e) {
     // _always_ reinterrupt the thread when you catch InterruptedException
     Thread.currentThread().interrupt();
     System.out.println("we have been interrupted");
     e.printStackTrace();
}