- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用ExecutorService.invokeAll(Callable, timeout, TimeUnit)方法
在提交给 ExecutorService 的每个 Callable 中,我都有一个 future.get()
即使 executorService 超时,future.get() 是否仍会在后台运行?
我是否还必须在 future.get(timeout, TimeUnit) 上指定超时并抛出 TimeoutException 以确保 future 终止?
最佳答案
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.get
的 Callable
中,其中 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/
我正在通过这个示例https://www.rusoto.org/futures.html学习Rust和Rusoto 而且我发现许多代码已经过时了。所以我改变了这样的代码: use rusoto_cor
这是一个理论问题。我有一个服务可以调用来完成工作,但该服务可能无法完成所有工作,因此我需要调用第二个服务来完成它。 我想知道是否有办法在没有 Await.result 的情况下做类似的事情map 函数
这个问题是关于如何阅读 Rust 文档并提高我对 Rust 的理解,从而了解如何解决这个特定的编译器错误。 我读过 tokio docs并试验了许多 examples .在编写自己的代码时,我经常遇到
我有一个使用分页的 HTTP api,我想将它包装到一个通用的 Rust 流中,以便所有端点都可以使用相同的接口(interface),这样我就可以使用 Stream 附带的特征函数特征。 我收到了这
我正在查看 AKKA 的 Java Futures API,我看到了很多处理同一类型的多个 future 的方法,但我没有看到任何处理不同类型的 future 的方法。我猜我让事情变得更加复杂了。 无
环境:Akka 2.1,scala 版本 2.10.M6,JDK 1.7,u5 现在是我的问题: 我有: future1 = Futures.future(new Callable>(){...});
我有一些代码可以将请求提交给另一个线程,该线程可能会也可能不会将该请求提交给另一个线程。这会产生 Future> 的返回类型.是否有一些非令人发指的方法可以立即将其变成 Future等待整个 futu
如果我有以下代码: Future a = new Future(() { print('a'); return 1; }); Future b = new Future.error('Error!')
我一直试图简化我在 Scala 中做 future 的方式。我有一次收到了 Future[Option[Future[Option[Boolean]]但我在下面进一步简化了它。有没有更好的方法来简化这
Scala 中从 Future[Option[Future[Int]]] 转换的最干净的方法是什么?至 Future[Option[Int]] ?甚至有可能吗? 最佳答案 有两个嵌套Future s
使用下面的示例,future2 如何在 future1 完成后使用 future1 的结果(不阻塞 future3 从被提交)? from concurrent.futures import Proc
这两个类代表了并发编程的优秀抽象,因此它们不支持相同的 API 有点令人不安。 具体根据docs : asyncio.Future is almost compatible with concurre
我正在尝试使用 wasm_bindgen 实现 API 类使用异步调用。 #![allow(non_snake_case)] use std::future::Future; use serde::{
这个问题在这里已经有了答案: Futures / Success race (3 个回答) 去年关闭。 所有的 future 最终可能会成功(有些可能会失败),但我们希望第一个成功。并希望将这一结果表
我在练习asyncio在编写多线程代码多年之后。 注意到一些我觉得很奇怪的东西。都在 asyncio在 concurrent有一个Future目的。 from asyncio import Futur
如何将Future[Option[Future[Option[X]]]]转换为Future[Option[X]]? 如果它是 TraversableOnce 而不是 Option 我会使用 Futur
我正在尝试同时发送 HTTP 请求。为此,我使用 concurrent.futures 这是简单的代码: import requests from concurrent import futures
我们在 vertx 中使用 Futures 的例子如下: Future fetchVehicle = getUserBookedVehicle(routingContext, client);
下面的函数,取自 here : fn connection_for( &self, pool_key: PoolKey, ) -> impl Future>, ClientError>
我正在围绕Java库编写一个小的Scala包装器。 Java库有一个对象QueryExecutor,它公开了2种方法: execute(query):结果 asyncExecute(query):Li
我是一名优秀的程序员,十分优秀!