有什么方法可以在Java中安排CompletableFuture?我要做的是安排要延迟执行的任务,并将其与其他操作链接起来,以便在完成时异步执行。到目前为止,我还没有找到任何方法。
对于良好的期货,我们有ScheduledExecutorService,我们可以在其中安排要延迟执行的任务,如下所示:
ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
Future<String> future = scheduledExecutorService.schedule(() -> "someValue", 10, TimeUnit.SECONDS);
CompletableFutures是否有类似的方法?
如果您使用的是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代替“默认执行程序”。
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();