gpt4 book ai didi

java - 如何检查 ExecutorService 上运行的所有任务是否已完成

转载 作者:IT老高 更新时间:2023-10-28 20:37:59 30 4
gpt4 key购买 nike

我有用于同步推送/弹出元素的 ConcurrentLinkedDeque,我有一些异步任务正在从堆栈中获取一个元素,如果这个元素有邻居,它将把它推到堆栈中。

示例代码:

private ConcurrentLinkedDeque<Item> stack = new ConcurrentLinkedDeque<>();
private ExecutorService exec = Executors.newFixedThreadPool(5);

while ((item = stack.pollFirst()) != null) {
if (item == null) {
} else {
Runnable worker = new Solider(this, item);
exec.execute(worker);
}
}

class Solider{
public void run(){
if(item.hasNeighbors){
for(Item item:item.neighbors){
stack.push(item)
}
}
}
}

我想在 while 循环中有额外的语句来回答这个问题 - “Executor 中的任何任务都在工作吗?”

最佳答案

如果您使用 ExecutorService.execute(Runnable),则无法检查所有 Runnable 是否已完成。 .除非你在 Runnable 本身中建立一个机制来这样做(我认为这很草率)。

改为:
使用ExecutorService.submit(Runnable) .此方法将返回 Future<?>这是 Runnable 结果的句柄.使用 Futures 提供了一种检查结果的简洁方法。

您所要做的就是维护您提交的 future 列表,然后您可以遍历整个 future 列表,并且:
A)等待所有 future 以阻塞方式完成或
B) 检查是否所有的 future 都以非阻塞方式完成。

这是一个代码示例:

List<Future<?>> futures = new ArrayList<Future<?>>();
ExecutorService exec = Executors.newFixedThreadPool(5);

// Instead of using exec.execute() use exec.submit()
// because it returns a monitorable future
while((item = stack.pollFirst()) != null){
Runnable worker = new Solider(this, item);
Future<?> f = exec.submit(worker);
futures.add(f);
}

// A) Await all runnables to be done (blocking)
for(Future<?> future : futures)
future.get(); // get will block until the future is done

// B) Check if all runnables are done (non-blocking)
boolean allDone = true;
for(Future<?> future : futures){
allDone &= future.isDone(); // check if future is done
}

关于java - 如何检查 ExecutorService 上运行的所有任务是否已完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33845405/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com