gpt4 book ai didi

java - ExecutorService.invokeAll(timeout, TimeUnit) 与 Future.get(timeout, TimeUnit)

转载 作者:行者123 更新时间:2023-11-30 06:22:07 26 4
gpt4 key购买 nike

我正在使用ExecutorService.invokeAll(Callable, timeout, TimeUnit)方法

在提交给 ExecutorService 的每个 Callable 中,我都有一个 future.get()

即使 executorService 超时,future.get() 是否仍会在后台运行?

我是否还必须在 future.get(timeout, TimeUnit) 上指定超时并抛出 TimeoutException 以确保 future 终止?

最佳答案

the documentation状态:

Upon return, tasks that have not completed are cancelled.

没有明确说明,但它使用了Future.cancel(true),即中断正在运行的任务。由于 Future.get() 支持中断,这将导致它通过抛出 InterruptedException 来完成。如果您的 Callable 没有捕获它,也没有执行任何可以重置中断状态的操作,则这意味着如果超时指定为,则可调用对象将停止在 Future.get() 中等待invokeAll 已过。

但是,invokeAll 仅取消 future,因此发送中断信号,但不会等待线程对其使用react并完成 Callable 的执行。的代码。因此,当 invokeAll 由于超时而完成时,某些线程可能仍在已取消的任务上运行。但如果这些任务仅包含 future::get,那么这应该不是问题。

<小时/>

但是,如果您想做的只是等待现有 Future 列表的完成,那么您可以更高效地完成此操作。毕竟,您将每个 Future 包装到调用 Future.getCallable 中,其中 invokeAll 将包装到另一个Future,每个 future 可能会阻塞一个工作线程,然后等待所有这些 future 的完成。最后一步正是此任务的目的,因此您可以在没有前面的步骤的情况下完成它,例如

public static void waitForAll(Collection<? extends Future<?>> futures,
long timeout, TimeUnit unit)
throws InterruptedException {

long nanos = unit.toNanos(timeout);
boolean done = false;
try {
final long deadline = System.nanoTime() + nanos;
final int size = futures.size();
for(Future<?> f: futures) {
if(!f.isDone()) {
if (nanos <= 0L) return;
try { f.get(nanos, TimeUnit.NANOSECONDS); }
catch(CancellationException | ExecutionException ignore) {}
catch(TimeoutException toe) { return; }
nanos = deadline - System.nanoTime();
}
}
done = true;
}
finally { if (!done) for(Future<?> f: futures) f.cancel(true); }
}

这基本上就是 AbstractExecutorService 在提交所有 Callable 后等待所有 future 完成的方式,为每个 Future 创建一个 Future。如前所述,如果您只想等待现有 future 的列表,您可以直接执行此操作,而无需通过向执行器提交作业来浪费资源。使用这种方法的另一个好处是,这将取消原来的 future,而不是仅仅取消等待 future 的作业。您还可以依赖此方法通过中断取消,但未为 invokeAll 显式指定此属性,

关于java - ExecutorService.invokeAll(timeout, TimeUnit) 与 Future.get(timeout, TimeUnit),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47907133/

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