【问题标题】:Thread.interrupt is returing falseThread.interrupt 返回 false
【发布时间】:2020-03-30 16:15:35
【问题描述】:

我正在尝试下面的代码,我中断了一个用户线程,当我打印 isInterrupted 的值时它返回 false,我没有得到一个 true 值,这里标志将在异常发生时重置被捕获或调用中断的方法。

其次,根据我的理解,sleep方法应该在每次迭代中抛出和interruptedException,catch print中的值,但它只抛出一次。


class ThreadInterruptt extends Thread
{
    public void run()
    {

        for(int i = 0; i<100;i++)
        {
            try {
                Thread.sleep(1000);
                System.out.println(i);
                System.out.println(isInterrupted());
            } catch (InterruptedException e) {
                System.out.println("Thread Interrupted");
            }
        }
    }
}
public class ThreadInterrupt {
    public static void main(String ag[]) throws InterruptedException
    {
        ThreadInterruptt t = new ThreadInterruptt();
        t.start();
        Thread.sleep(100);
        t.interrupt();

    }

}

【问题讨论】:

    标签: java multithreading concurrency java-threads


    【解决方案1】:

    如果您被中断,您将永远无法到达isInterrupted() 检查:Thread.sleep() 会抛出异常,并且它还会清除线程的中断状态 as described in the Javadoc

    然后您将丢弃线程被中断的事实(因为您没有在捕获异常时重置中断标志),因此它不会在下一次迭代中被中断。

    【讨论】:

    • isInterrupted() 不应该返回 true 吗?在 t.interrupt() 之后;
    • @Shelly 介于您调用 t.interrupt() 和下次调用 Thread.sleep 之间。但是,Thread.sleep 会清除中断状态,如 Javadoc 中所述。
    • @Shelly 那是因为那发生在你打断它之前。
    • @Shelly 我不明白你在问什么。
    • 原则上,不能保证一个线程在可运行的同时获得CPU,所以即使主线程执行sleep(100)和另一个sleep(1000),也有可能主线程在睡眠后的 900 毫秒内没有任何进展。在这种情况下,在 sleep(1000) 和 isInterrupted() 之间中断另一个线程的可能性非常小。在那种不太可能的极端情况下,程序会打印一次 true,但下一次 sleep 仍会清除中断状态。
    猜你喜欢
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 2015-08-02
    • 2012-05-17
    • 2013-10-26
    • 2013-01-06
    • 2011-01-24
    相关资源
    最近更新 更多