繁体   English   中英

ScheduledExecutorService:如何等待所有任务完成然后执行更多任务

[英]ScheduledExecutorService: how to wait for all tasks to finish then execute more tasks

我的代码是这样的:

ScheduledExecutorService executor = Executors.newScheduledThreadPool(8);

//complex code that call this multiple times too add tasks:
executor.schedule(() -> { doRealTask(); }, 0, TimeUnit.MICROSECONDS);

//drain the pool on some condition, e.g. meets tasks that can't be parallelized:
executor.shutdown();//without this, awaitTermination won't return since all the threads in the pool will be paused, not terminated
executor.awaitTermination(1000000, TimeUnit.SECONDS);

//continue to add more tasks:
executor.schedule(...);

java.util.concurrent.RejectedExecutionException 在最后一个代码上抛出。 原因似乎是 executor 已关闭。 但是没有“startAgain”function。 显然创建一个新的 ScheduledExecutorService 是可行的,但我觉得我使用了错误的解决方案。

如何在 Java 中实现这一点?

将您的未来存储在列表中,然后使用 get 有效地加入。

List<Future<?>> futures = new ArrayList<>();

futures.add(executor.schedule(() -> { doRealTask(); }, 0, TimeUnit.MICROSECONDS));

而不是关机。

for(Future<?> future: futures){
    future.get();
}

futures.clear();

现在您需要处理异常,并且可能在获取时包含超时。

关闭的 state 是不可逆的,所以如果需要,只需要创建一个新的执行器。 没有其他方法可以重用前一个。 但是,如果要再次创建它,为什么需要关闭它呢? 如果它有太多任务并且您可以牺牲它们以支持新任务,那么为每个任务配置合理的超时并配置池本身(例如,池和任务队列大小)是有意义的。

每次调用Executor.schedule(() -> { doRealTask(); }, 0, TimeUnit.MICROSECONDS); 将返回ScheduledFuture实例,您可以将其存储并稍后处理结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM