哪个执行程序更好地传递给CompletableFuture supplyAsync Executors.newFixedThreadPool(10)或新的ForkJoinPool(10)

时间:2019-05-16 16:22:55

标签: java multithreading executorservice threadpoolexecutor forkjoinpool

我正在使用CompletableFuture.supplyAsync,我不想使用Forkjoinpool.commonpool,我想将池传递给它。

当前,我正在创建并使用静态池引用,因为我不想为每个请求都创建池。

我想知道以下两种方法中哪一种最好。

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 个答案:

答案 0 :(得分:1)

  

所以我的问题是,如果我在上面使用forkJoinPool   JVM是否等待直到完成,因为我使用了“ .get”阻止调用   否则它将退出,因为它们是守护程序线程。

我假设您正在主线程或其他一些非守护进程线程中调用get()。在这种情况下,VM不会在get()的调用完成之前终止,因此在那之前,池中的线程是守护线程还是普通线程都没有关系。

之后,您get的最终结果是您的池不再有任何要执行的任务,唯一真正的问题是执行干净的VM关闭。您应该 shutdown()shutdownNow()池,在这种情况下,您应该看到的差别很小或没有差别。但是,如果您忽略关闭池,那么您可能会发现带有固定线程池的程序版本终止缓慢或根本没有终止。