簡體   English   中英

是否可以安排 CompletableFuture?

[英]Is it possible to schedule a CompletableFuture?

有沒有辦法在 Java 中安排 CompletableFuture? 我想要做的是安排一個任務以一些延遲執行,並在它完成時將它與其他異步執行的操作鏈接起來。 到目前為止,我還沒有找到任何方法來做到這一點。

對於好的 ol' Futures,我們有例如 ScheduledExecutorService,我們可以在其中安排一個任務以延遲執行,如下所示:

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

CompletableFutures 有沒有類似的方法?

如前所述,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(() -> executor.execute(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)可能滿足您的需求:

返回一個新的 Executor,它在給定的延遲后(如果非正則沒有延遲)將任務提交給默認的 executor。 每次延遲都在調用返回的執行程序的execute方法時開始。

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

還有一個重載,您可以在其中指定要使用的Executor來代替“默認執行器”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM