Thread.sleep不会抛出InterruptedException

问题描述 投票:1回答:1

我有一个线程休眠一段时间并连续进行一些工作。

public void run() {
    while(true) {
        try {
            Thread.sleep(SOME_RANDOM_TIME);
        } catch (InterruptedException e) {
            return;
        }
        doSomeLabour();
    }
}

我有一堆在Executors上运行的线程。当我在执行程序上调用shutdownNow时,线程有时不会终止。 shutdownNow所做的只是在所有正在运行的线程上调用interrupt,并且不接受任何新线程。

所以,基本上,我只是中断所有线程。

我了解,当thread不在睡眠中并且被中断时,我的代码不会发生任何事情;但是,在完成工作之后,由于仍在该线程上设置了中断标志,因此下次线程尝试进入睡眠状态时,sleep(..)是否应在下一次抛出InterruptedException

java threadpool interrupt java-threads interrupted-exception
1个回答
0
投票

怎么样

while(!Thread.currentThread().isInterrupted()) {
    try {
        Thread.sleep(SOME_RANDOM_TIME);
    } catch (InterruptedException e) {
        return;
    }
    doSomeLabour();
}

代替?

Thread.interrupt()的JDK Javadoc状态:

如果此线程在调用wait(),wait(long), 或Object类或join()的wait(long,int)方法, join(long),join(long,int),sleep(long)或sleep(long,int),方法 此类,则将清除其中断状态并将其 收到InterruptedException。

因此sleep()本身不会引发InterruptedException,而如果线程当前正在睡眠,则中断器会抛出InterruptedException。

© www.soinside.com 2019 - 2024. All rights reserved.