可以在!.isTerminated循环中添加Thread.sleep吗?

时间:2019-06-06 20:09:51

标签: java multithreading sleep

典型的ExecutorService示例显示了使用while循环,该简单循环在关闭请求后终止了简单测试。我的想法是,while循环被调用得太多了,什么也没做。

将Thread.sleep(x)放入循环中可以释放一些处理器资源吗?

es.shutdown();
while (!es.isTerminated()) {
    try {
        Thread.sleep(60000);
    } catch (InterruptedException e) {
        e.printStackTrace();
        return;
    }
}

2 个答案:

答案 0 :(得分:3)

这里主要的错误是:

  • 您仅每60秒检查一次终止。因此,如果您只是错过了从未终止到终止的更改,那么您可能要等待60秒钟以上的时间
  • 被中断时,您不会重新中断当前线程。如果您被打扰,您(几乎)总是希望保留被打扰的事实,以便调用此代码的代码可以知道它需要停止正在执行的操作。理想情况下,这是通过允许InterruptedException传播来完成的,但是也可以通过重新中断线程来实现。

最好使用

es.awaitTermination(60, SECONDS);

以便在执行程序终止时立即停止。

而且,当您遇到中断时:

Thread.currentThread().interrupt();

允许其传播。

或者,放弃循环,只是睡了很长时间:

es.awaitTermination(Long.MAX_VALUE, SECONDS);

答案 1 :(得分:0)

在这种特定情况下,仅当您绝对需要在执行任何其他逻辑之前使执行程序服务失效时,才使用Thread.sleep

如果不是这种情况,那么在执行程序关闭时暂停睡眠的主线程没有多大意义,Jvm在执行Thread.sleep(60000)时不会释放很多资源