是否可以安排CompletableFuture?

问题描述 投票:0回答:2

有什么方法可以在Java中安排CompletableFuture?我要做的是安排要延迟执行的任务,并将其与其他操作链接起来,以便在完成时异步执行。到目前为止,我还没有找到任何方法。

对于良好的期货,我们有ScheduledExecutorService,我们可以在其中安排要延迟执行的任务,如下所示:

ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
Future<String> future = scheduledExecutorService.schedule(() -> "someValue", 10, TimeUnit.SECONDS);

CompletableFutures是否有类似的方法?

java concurrency scheduled-tasks completable-future
2个回答
1
投票

如果您使用的是Java 9+,则CompletableFuture#delayedExecutor(long,TimeUnit)可能满足您的需求:

返回一个新的执行程序,该执行程序在给定的延迟(如果非肯定,则不延迟)之后将任务提交给默认执行程序。每个延迟都从调用返回的执行者的CompletableFuture#delayedExecutor(long,TimeUnit)方法开始。

execute

还有Executor delayed = CompletableFuture.delayedExecutor(10L, TimeUnit.SECONDS); CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "someValue", delayed); ,您可以在其中指定要使用的an overload代替“默认执行程序”。


0
投票

Executor,Java 9中有支持。

但是在Java 8下创建类似功能并不难;您已经命名了必要的元素:

As said

可以类似于Java 9功能使用:

// prefer this constructor with zero core threads for a shared pool,
// to avoid blocking JVM exit
static final ScheduledExecutorService SCHEDULER = new ScheduledThreadPoolExecutor(0);
static Executor delayedExecutor(long delay, TimeUnit unit)
{
  return delayedExecutor(delay, unit, ForkJoinPool.commonPool());
}
static Executor delayedExecutor(long delay, TimeUnit unit, Executor executor)
{
  return r -> SCHEDULER.schedule(r, delay, unit);
}

必须注意避免共享的调度执行器线程阻止JVM终止。零核心池大小的替代方法是使用守护程序线程:

Executor afterTenSecs = delayedExecutor(10L, TimeUnit.SECONDS);
CompletableFuture<String> future 
  = CompletableFuture.supplyAsync(() -> "someValue", afterTenSecs);

future.thenAccept(System.out::println).join();
© www.soinside.com 2019 - 2024. All rights reserved.