假设我有一些异步计算,比如:
CompletableFuture
.supplyAsync(() -> createFoo())
.thenAccept(foo -> doStuffWithFoo(foo));
如果异步供应商根据某个指定的超时超时,有没有一种很好的方法为foo提供默认值?理想情况下,这样的功能也会尝试取消运行缓慢的供应商。例如,是否存在与以下假设代码类似的标准库功能:
CompletableFuture
.supplyAsync(() -> createFoo())
.acceptEither(
CompletableFuture.completedAfter(50, TimeUnit.MILLISECONDS, DEFAULT_FOO),
foo -> doStuffWithFoo(foo));
CompletableFuture
.supplyAsync(() -> createFoo())
.withDefault(DEFAULT_FOO, 50, TimeUnit.MILLISECONDS)
.thenAccept(foo -> doStuffWithFoo(foo));
编辑:这里有一个受Java8启发的解决方案:在lambda表达式中强制检查异常处理。为什么是强制的,而不是可选的?,但不幸的是它阻塞了一个线程。如果我们依赖于createFoo()异步检查超时并抛出它自己的超时异常,那么它可以在不阻塞线程的情况下工作,但是会给供应商的创建者带来更多的负担,并且仍然需要创建异常(如果没有“快速抛出”,创建异常的成本可能会很高)
static <T> Supplier<T> wrapped(Callable<T> callable) {
return () -> {
try {
return callable.call();
} catch (RuntimeException e1) {
throw e1;
} catch (Throwable e2) {
throw new RuntimeException(e2);
}
};
}
CompletableFuture
.supplyAsync(wrapped(() -> CompletableFuture.supplyAsync(() -> createFoo()).get(50, TimeUnit.MILLISECONDS)))
.exceptionally(e -> "default")
.thenAcceptAsync(s -> doStuffWithFoo(foo));
CompletableFuture.SupplyAsync只是一个帮助器方法,它为您创建一个CompletableFuture,并将任务提交给ForkJoin池。
您可以根据您的需求创建自己的supplyAsync,如下所示:
private static final ScheduledExecutorService schedulerExecutor =
Executors.newScheduledThreadPool(10);
private static final ExecutorService executorService =
Executors.newCachedThreadPool();
public static <T> CompletableFuture<T> supplyAsync(
final Supplier<T> supplier, long timeoutValue, TimeUnit timeUnit,
T defaultValue) {
final CompletableFuture<T> cf = new CompletableFuture<T>();
// as pointed out by Peti, the ForkJoinPool.commonPool() delivers a
// ForkJoinTask implementation of Future, that doesn't interrupt when cancelling
// Using Executors.newCachedThreadPool instead in the example
// submit task
Future<?> future = executorService.submit(() -> {
try {
cf.complete(supplier.get());
} catch (Throwable ex) {
cf.completeExceptionally(ex);
}
});
//schedule watcher
schedulerExecutor.schedule(() -> {
if (!cf.isDone()) {
cf.complete(defaultValue);
future.cancel(true);
}
}, timeoutValue, timeUnit);
return cf;
}
使用该帮助程序创建CompletableFuture与使用CompletableFuture中的静态方法一样简单:
CompletableFuture<String> a = supplyAsync(() -> "hi", 1,
TimeUnit.SECONDS, "default");
要对其进行测试:
a = supplyAsync(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e1) {
// ignore
}
return "hi";
}, 1, TimeUnit.SECONDS, "default");
问题内容: 我似乎有时会遇到一些tcp请求被“卡住”的麻烦,就像它正在等待一些响应,但连接已被“切断”,因此响应永远不会到来。这是具有默认超时的HttpURLConnection的预期行为吗?是否设置了明智的默认设置,以便默认情况下我无法进入这种奇怪的“挂起”情况? 问题答案: 出现HttpURLConnection的“默认”超时为零,表示“无超时”。 不幸的是,根据我的经验,根据您与服务器的连接
问题内容: 我正在运行golang http客户端以对服务器进行压力测试。有时我收到错误“拨号tcp 161.170.xx.xxx:80:操作超时”错误。 我认为这是HTTP客户端超时。我正在考虑基于增加超时值,但是我想先找出golang中的默认超时值是多少。如果它取决于操作系统而不是语言,那么如何在Mac OS中检查此值? 问题答案: 根据http://golang.org/pkg/net/#D
问题内容: 我感兴趣的selenium超时的默认值,和。因为我想知道,我需要为这些超时设置值吗?或默认值适合selenium webdriver工作。但是我找不到正确的答案,有人说默认值是0,而另一个人说是30秒。 问题答案: 这三个超时由Selenium方程的服务器端管理。您的脚本(使用Java,Python,Ruby,C#或其他任何语言)是将命令发送到位于浏览器中的服务器的客户端。(可能会有中
问题内容: 我收到了一个我无法复制的错误报告,但是ajax调用超时是当前的最佳猜测。 因此,我试图找出jQuery 调用超时的默认值。有人有主意吗?在jQuery文档中找不到。 在此先感谢Marcus 问题答案: 似乎没有标准化的默认值。我感觉默认值为,而超时事件完全取决于浏览器和网络设置。 对于IE,还有对XmlHttpRequests超时属性在这里。它默认为null,表示网络堆栈很可能是第一个
注:内容翻译自官网文档 Language Guide (proto3) 中的 Default Values 一节 当消息被解析时, 如果被编码的消息没有包含特定的简单元素, 被解析的对象对应的字段被设置为默认值. 默认值是和类型有关的: 对于strings, 默认值是空字符串(注, 是"", 而不是null) 对于bytes, 默认值是空字节(注, 应该是byte[0], 注意这里也不是null)
问题内容: 在我的应用程序中,我有一个“编辑用户详细信息”页面,我想在相应的editText字段中显示当前名称,电子邮件地址等,然后用户可以删除它们并根据需要输入一个新名称。 有没有办法做到这一点?谢谢你的帮助 问题答案: 您可以用来设置EditText字段的当前文本。 例: