Какой из исполнителей лучше передать в CompletableFuture supplyAsync Executors.newFixedThreadPool (10) или новый ForkJoinPool (10) - PullRequest
1 голос
/ 16 мая 2019

Я использую CompletableFuture.supplyAsync, я не хочу использовать Forkjoinpool.commonpool, я хочу передать ему пул.

В настоящее время я создаю статическую ссылку на пул и использую ее, потому что я не хочу создавать пул для каждого запроса.

Я хочу знать, какой из 2 способов ниже.

private static ExecutorService processingPool = Executors.newFixedThreadPool(10);
CompletableFuture.supplyAsync( () -> process(),processingPool);

или

private static ForkJoinPool processingPool = new ForkJoinPool(10);
CompletableFuture.supplyAsync( () -> process(),processingPool);

Также я читал, что ForkJoinPool создает потоки в режиме демона. Я использую блокировку вызова ".get" в конце всей обработки, чтобы объединить результаты. Поэтому мой вопрос здесь заключается в том, что в случае, если я использую forkJoinPool в приведенном выше примере, JVM будет ждать завершения до завершения, поскольку я использовал блокирующий вызов «.get», или он завершится, поскольку они являются потоками демона.

1 Ответ

1 голос
/ 16 мая 2019

Так что мой вопрос здесь, в случае, если я использую forkJoinPool в приведенном выше JVM ожидает завершения, когда я использовал блокирующий вызов ".get" или он выйдет, поскольку они являются потоками демона.

Я предполагаю, что вы вызываете get() в главном потоке или в другом потоке, не являющемся демоном. В этом случае виртуальная машина не прекратит работу до завершения вызова get(), поэтому до этого момента не имеет значения, являются ли потоки в вашем пуле потоками демона или обычными.

После вы get ваших окончательных результатов, так что в вашем пуле больше нет задач для выполнения, единственная реальная проблема - это чистое завершение работы виртуальной машины. Вы должны shutdown() или shutdownNow() пул, и в этом случае вы должны увидеть небольшую или никакую разницу. Однако, если вы не захотите завершить работу пула, то вы можете обнаружить, что версия вашей программы с фиксированным пулом потоков медленно или совсем не завершается.

...