调用thread.isInterrupted并打印结果时的不同行为

时间:2014-12-15 18:12:59

标签: java multithreading interrupted-exception

我对下面程序中thread.isInterrupted的行为感到困惑。

public class ThreadPractice {

    public static void main(String args[]) throws InterruptedException {

        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println("Starting thread..." + Thread.currentThread().getName());
                    Thread.sleep(10000);
                    System.out.println("Waking up");
                }catch(InterruptedException e){
                    System.out.println("Thread is interrupted!!!");
                    Thread.currentThread().interrupt();
                }
            }
        });

        t.start();
        Thread.sleep(2000);
        t.interrupt();
        //System.out.println(!t.isInterrupted());
        while(!t.isInterrupted()){
            System.out.println("Current thread not interrupted!!!");
        } 
    }
}

当执行上述程序时,它会打印,

Starting thread...Thread-0
Thread is interrupted!!!

但是当我取消注释System.out语句以打印中断状态时,它会遇到无限循环打印"当前线程未被中断"

我无法弄清楚System.out语句到底有什么区别。

2 个答案:

答案 0 :(得分:5)

请注意,我并不总是无限循环。

我怀疑这是由于操作的交错。它还有助于检查线程是否存活:

System.out.println("Current thread not interrupted!!! Alive? " + t.isAlive());

如果线程未处于活动状态,则其中断状态为false。

我得到的输出如下:

  

启动线程...线程-0
  线程中断!!!
  当前线程没有中断!活?真正
  当前线程没有中断!活?假
  [无限循环]

我猜第一个循环看到线程没有被中断,因为InterruptedException已经删除了标志 - 然后你在interrupt()方法中用run()重置了标志,线程可以完成不再活着了。
下一个循环检查看到它没有活着,你开始一个无限循环。


通过添加:

可以获得有趣的变化
System.out.println("Exiting Thread!!!");

run()方法结束时 - 它提供了一个足够长的延迟,以便在重置中断标志的时间和线程死亡的时间之间检查循环条件。

答案 1 :(得分:-1)

根据Java程序,一旦所有非守护程序线程结束,JVM将结束。

如果您没有调用t.interrupt(),则Child Thread将处于活动状态。所以,如果你检查while t.isInterrupted(),它返回true。所以循环中断。

如果在执行该操作时调用t.interrupt(),则子线程将被中断。因此,如果您检查while循环t.isInterrupted(),则返回false。因为根据Java Doc

线程中断被忽略,因为在中断时线程不活动将被此方法反映返回false。

while(true){ }

所以循环从不破坏。