Java ForkJoinPool 线程限制还是 Java 流替代方案?



我知道java parallelStream(或ForkJoinPool)旨在最大化CPU利用率。 由于java流功能接口(如map,reduce,filter)和ForkJoinPool的完美结合,我使用java并行流和ForkJoinPool。

问题是 ForkJoin 不限制活动线程的数量。 如果某些线程在占用大量内存时阻塞,ForkJoinPool 会尝试创建更多线程以满足并行性(正在运行的线程)。

在这种情况下,CPU 利用率将最大化,但堆内存将耗尽甚至进入 OOM。

如何限制 ForkJoinPool 的活动线程数?

或者是否有任何 java 流接口替代方案?

我知道java parallelStream(或ForkJoinPool)旨在最大化CPU利用率。

这不完全是目标。 它可能具有最大化 CPU 利用率的效果,但目标是加快计算速度。 那不是一回事。

如何限制 ForkJoinPool 的活动线程数?

根据这个邮件列表线程,防止forkjoin线程池在病理情况下爆炸的一种方法是提供一个自定义ForkJoinThreadFactory,该跟踪现有线程的数量(以某种方式)并在已经存在太多线程时返回null

请注意,如果您确实达到了限制(由工厂施加),您将在提交任务时获得RejectedExecutionException


或者是否有任何Java流接口替代方案?

我不知道一个。

但是我不相信您在以正常方式使用Stream.parallelStream()时会遇到此问题。

如果您确实遇到它并且被拒绝的执行有问题,您可能需要寻找另一种方法来表达计算;例如,使用协程而不是线程,或者使用工作队列和Executor,或者我没有想到的其他东西:-)

相关内容

最新更新