是否可以安排CompletableFuture?

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

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

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

CompletableFutures是否有类似的方法?

mkjianglijun 回答:是否可以安排CompletableFuture?

As said,在Java 9中有支持。

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

// 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);
}

可以与Java 9功能类似地使用:

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

future.thenAccept(System.out::println).join();

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

static final ScheduledExecutorService SCHEDULER
  = Executors.newSingleThreadScheduledExecutor(r -> {
    Thread t = new Thread(r);
    t.setDaemon(true);
    return t;
  });
,

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

  

返回一个新的执行程序,该执行程序在给定的延迟(如果为非正数,则没有延迟)之后将任务提交给默认执行程序。每次延迟都是从调用返回的执行者的execute方法开始的。

Executor delayed = CompletableFuture.delayedExecutor(10L,TimeUnit.SECONDS);
CompletableFuture.supplyAsync(() -> "someValue",delayed)
    .thenAccept(System.out::println)
    .join();

还有an overload,您可以在其中指定Executor来代替“默认执行程序”。

本文链接:https://www.f2er.com/3161052.html

大家都在问