gpt4 book ai didi

java - 如何检查所有任务是否已完成(正常或突然)?

转载 作者:行者123 更新时间:2023-11-29 07:39:06 25 4
gpt4 key购买 nike

我有以下类(class):

public class Service{
private static final ExecutorService executor = Executors.newFixedThreadPool(4);

public synchronized void execute(Collection<Runnable> runs){
for(Runnable r: runs){
executor.execute(r);
}
}

public boolean isComplete(){
//should return true iff all tasks applied by the execute(Collection<Runnable> runs)
//method're finished their execution (normally or abruptly,
//it doesn matter)
}
}

如何实现 isComplete() 方法。我需要检查当前是否有正在进行的任务。如果执行器被清除(所有任务都已完成),则该方法应返回 true,否则返回 false。

最佳答案

鉴于您正在使用 ExecutorService,您可以使用 submit而不是 execute 并将返回的 Future 存储在列表中。然后在 isComplete() 中遍历所有 Future 并对每个调用 isDone()。 (这种方法还可以让您在需要时通过 Future 取消提交的任务)。

例如:

class Service{
private static final ExecutorService executor = Executors.newFixedThreadPool(4);
private List<Future<?>> futures;
public void execute(Collection<Runnable> runs){
futures = runs.stream()
.map(r -> executor.submit(r))
.collect(Collectors.toList());
}

public boolean isComplete(){
for (Future<?> future : futures)
if (!future.isDone()) return false;

return true;
}
}

根据您的用例,您可以通过从 futures 列表中删除项目来获得更好的性能,但您(可能)需要同步 isComplete 方法:

    public synchronized boolean isComplete(){
Iterator<Future<?>> itr = futures.iterator();
while (itr.hasNext()) {
if (itr.next().isDone()) itr.remove();
else return false;
}
return true;
}

编写此代码示例时,它假定您只会对每个 Service 实例调用一次 execute , 所以它不需要同步。如果您将有多个并发调用者在每个 Service 实例上执行 execute 那么请注意,这将在每次调用 时替换 futures 列表执行。您可以通过使类仅供一次性使用或附加到 futures 来解决这个问题。这完全取决于您的用例。

关于java - 如何检查所有任务是否已完成(正常或突然)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32308554/

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