Как уже говорилось , в 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;
});