1

我有这段代码:

  public void run()
        {
        System.out.println("ciao"); 
        try{
        throw new InterruptedException();
        }catch(InterruptedException ie){ //catch will clear the interrupted status

Thread.currentThread().interrupt();}//it will set back the interrupted status

但是,如果我调用以下方法,则遵循此模式:

Thread1 t1 = new Thread1();//obviously Thread1 extends Thread
        t1.start();

        System.out.println(t1.isInterrupted());

结果为“假”;

另一方面,如果我删除throw new InterruptedException();并尝试从主要方法中中断它,它会返回我预期的结果:

Thread1 t1 = new Thread1();
        t1.start();
        t1.interrupt();
System.out.println(t1.isInterrupted());

它将返回“真”。

这只是一个一致性内存问题还是我在代码中做错了什么?提前致谢。

编辑:我编辑了删除方法 join() 的问题,如 JB Nizet 所示,问题仍然存在。

4

2 回答 2

4

抛出 InterruptedException 不会设置中断标志。抓住它并不能清除它。

andinterrupted()是一个静态方法,它告诉当前线程是否被中断。

此外,测试线程在加入后是否被中断将始终返回 false,因为join()清除了中断标志。

于 2013-06-02T16:26:43.453 回答
1

根据文档

按照惯例,任何通过抛出 InterruptedException 退出的方法都会在这样做时清除中断状态。然而,中断状态总是有可能被另一个线程调用中断立即再次设置。

并且Thread.join抛出 InterruptedException

于 2013-06-02T16:33:21.143 回答