В java-9 был введен новый метод completeOnTimeout
в классе CompletableFuture
:
public CompletableFuture<T> completeOnTimeout(T value, long timeout,
TimeUnit unit) {
if (unit == null)
throw new NullPointerException();
if (result == null)
whenComplete(new Canceller(Delayer.delay(
new DelayedCompleter<T>(this, value),
timeout, unit)));
return this;
}
Я не понимаю, почему он использует статический ScheduledThreadPoolExecutor
в своей реализации:
static ScheduledFuture<?> delay(Runnable command, long delay,
TimeUnit unit) {
return delayer.schedule(command, delay, unit);
}
куда
static final ScheduledThreadPoolExecutor delayer;
static {
(delayer = new ScheduledThreadPoolExecutor(
1, new DaemonThreadFactory())).
setRemoveOnCancelPolicy(true);
}
Для меня это очень странный подход, так как он может стать узким местом для всего приложения: единственным из них является ScheduledThreadPoolExecutor
с единственным потоком, содержащимся внутри пула для всех возможных задач CompletableFuture
?
Что мне здесь не хватает?
PS Это выглядит так:
1) авторы этого кода не хотели извлекать эту логику и предпочли повторно использовать ScheduledThreadPoolExecutor
,
2), и это, по-видимому, привело к такому решению со статической переменной, поскольку очень сложно создать новый исполнитель для каждого CompletableFuture
.
Но мое сомнение по-прежнему остается, поскольку я нахожу общий подход странным.