【问题标题】:Java ForkJoinPool thread limit or Java stream alternative?Java ForkJoinPool 线程限制还是 Java 流替代方案?
【发布时间】:2020-12-23 01:38:50
【问题描述】:

我了解 java parallelStream(或 ForkJoinPool)旨在最大限度地提高 CPU 利用率。 由于 java 流功能接口(如 map、reduce、filter)和 ForkJoinPool 的完美结合,我使用 java parallelstream 和 ForkJoinPool。

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

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

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

或者有没有java流接口替代品?

【问题讨论】:

标签: java java-stream


【解决方案1】:

我了解 java parallelStream(或 ForkJoinPool)旨在最大限度地提高 CPU 利用率。

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

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

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

请注意,如果您确实达到了限制(由您的工厂强加),您将在提交任务时收到RejectedExecutionExceptions。


或者有没有java流接口替代品?

我不知道。

但我不相信你在正常使用Stream.parallelStream()时会遇到这个问题。

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

【讨论】:

    猜你喜欢
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多