Java线程池已经被多次与ForkJoin中的其他“经典”线程池实现进行比较。不过,我的问题略有不同:
对于同时具有长时间运行、套接字处理、事务性线程和短时间运行任务(CompletableFuture)这两种线程使用类型的应用程序,我能否使用单个共享ForkJoin池?或者我必须经历为每种类型的需求维护两个单独的池的痛苦吗?换句话说,是否存在显著的(性能?)损失,如果在其他Java线程池实现足够的地方使用ForkJoin?
发布于 2021-11-01 23:49:37
根据documentation的说法,这取决于:
(3)除非使用ForkJoinPool.ManagedBlocker API,或者已知可能阻塞的任务数少于池的ForkJoinPool.getParallelism()级别,否则池不能保证有足够的线程可用来确保进度或良好的性能。
并行度与可用CPU核心的数量有关。因此,如果有足够的CPU核心,并且没有太多的阻塞I/O任务,那么您可以使用commonPool。然而,这并不意味着你应该这样做。首先,ForkJoinPool显然不是为长时间运行(阻塞)任务而设计的。另一方面,您可能希望在关机期间对长时间运行(阻塞)的任务执行一些操作。
https://stackoverflow.com/questions/69801426
复制相似问题