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