java - 在不知道何时完成所有任务的情况下关闭执行程序
问题描述
我有一个任务应该等待一个条件(OpenCms 启动),然后通知一些听众。为此,我使用了 ExecutorService:
public void check(final ExecutorService executorService) {
executorService.submit(() -> {
waitForInitialization();
notifyListeners();
});
}
private void waitForInitialization() {
while (OpenCms.getRunLevel() < OpenCms.RUNLEVEL_4_SERVLET_ACCESS) {
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
问题是如何关闭这个执行器。我可以使用awaitTermination
,但我应该提供一个我不确切知道的超时。它可能因环境而异。
解决方案
问题是如何关闭这个执行器。我可以使用 awaitTermination 但我应该提供一个我不确切知道的超时。它可能因环境而异。
我要问的问题是你需要超时吗?通常,如果您知道某项工作将在某个时候完成,我只需等待超时Long.MAX_VALUE
——实际上是永远。其他时候我会做类似的事情:
threadPool.shutdown();
threadPool.awaitTermination(...)
一些小的值(可能是 10 秒)threadPool.shutdownNow();
中断线程threadPool.awaitTermination(...);
因为Long.MAX_VALUE
我知道工作最终会完成
它可能因环境而异。
如果它可能会有所不同,那么也许您应该能够计算出每个环境的适当超时时间?
最后,不要害怕传入ThreadFactory
创建守护线程的 a。对于某些作业,我shutdown()
使用线程池,但从不等待它们完成,因为我不关心它们的状态,所以我在启用守护程序的池中创建线程,可能使用类似以下线程工厂的东西。
/** Thread factory which sets name and optionally daemon */
public class PoolNameThreadFactory implements ThreadFactory {
private final String poolName;
private final Boolean daemon;
private final AtomicInteger threadNum = new AtomicInteger(0);
public PoolNameThreadFactory(String poolName) {
this(poolName, null);
}
public PoolNameThreadFactory(String poolName, boolean daemon) {
this(poolName, (Boolean) daemon);
}
private PoolNameThreadFactory(String poolName, Boolean daemon) {
this.poolName = poolName;
this.daemon = daemon;
}
@Override
public Thread newThread(Runnable r) {
Thread thread = new Thread(r);
thread.setName(poolName + '-' + threadNum.incrementAndGet());
if (daemon != null) {
thread.setDaemon(daemon);
}
return thread;
}
}
推荐阅读
- javascript - 重用 Axis Scale 覆盖设置域
- c++ - C ++:array1 = array2 vs使用循环将array2的值分配给array1
- c# - 使用 AngleSharp 向 Microsoft 进行身份验证
- java - 为什么用轻微形式编写的 2 个相同的数字会在 Java 中产生 2 个不同的结果
- c# - Mathf.SmoothDamp 立即发生(Unity 3d)
- arrays - 如何将指针显示为可能具有一定范围的数组
- javascript - Discord.js(v12)赠品命令->错误:无法读取未定义的属性“hasPermission”
- python - 证书透明度日志-API 限制条目范围
- google-sheets - Google 表格 - 使用下拉列表过滤
- react-native - React Native Navigation 5.x 给出导航错误