Исходя из того, что я прочитал в Интернете, для каждого вызова характерно использование нового потока.
(1) Это имеет место, только если аппарат не поддерживает параллелизмили вы сделали это, чтобы не поддерживать его, установив системное свойство java.util.concurrent.ForkJoinPool.common.parallelism
в 0
или 1
.
8 процессоров
(2) Если машина поддерживает параллелизм, используется ForkJoinPool.commonPool()
и уровень параллелизма устанавливается, я полагаю, в число доступных процессоров (которое можно определить с помощью Runtime#availableProcessors
).
В сценарии с 8 процессорами, вероятно, будет создано 7-8 потоков для обслуживания общих ForkJoinPool
.
Я хочу использовать CompletableFuture
, но я хочу CompletableFuture
для повторного использования определенного потока вместо управления его собственными потоками.
A DelayedExecutor
просто передает задачи базовому Executor
, который является либо ThreadPerTaskExecutor
(1), либоForkJoinPool
(2).
К счастью, вы можете вручную указать Executor
, который будет использоваться DelayedExecutor
для делегирования задач.
Executor delayedExecutor =
CompletableFuture.delayedExecutor(1, TimeUnit.MILLISECONDS, executor);
Он возвращает нас к вашему предыдущему вопросу, где я указал , что Executor
можно определить с помощью ThreadFactory
.
Executor executor = Executors.newCachedThreadPool(YourThreadClass::new);