来自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
,它如何区分两个线程;示例interrupted
和main
。 Thread-0
的{{1}}是否相同?
确切的步骤顺序是static flag
,Threads
和set flag
等在哪里?
当我look up
下面unset flag
的块(当前是c uncomment
)时,程序永远不会停止。我不明白为什么?
code
答案 0 :(得分:4)
的javadoc当我取消注释下面的代码块时(目前已注释掉了) out),程序永远不会停止。我不明白为什么?
如果在调用 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();
}