我知道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
,或者我没有想到的其他东西:-)