【发布时间】:2022-02-03 10:11:47
【问题描述】:
list.parallelStream().forEach(element -> ...);
现在如何限制并行线程的数量?
过去有一个“hack”来设置系统属性java.util.concurrent.ForkJoinPool.common.parallelism。但这感觉不对,而且它不再起作用了。
您能否建议如何将列表分块分成 4 个部分,然后仅并行运行这 4 个部分?
【问题讨论】:
-
“它不再起作用了”——真的吗?您指的是哪个 Java 版本?
-
Jdk14.也许我做错了,但除此之外,我也不想改变整个应用程序的并行性。但只需限制一个特定的流。
-
必须是流操作吗?毕竟,你只是在你的例子中使用了
forEach,并且从字面上询问“如何将列表分成 4 个部分”,这实际上是一个微不足道的操作。除非您需要特定的 Stream 功能。 -
@Holger 是的,但问题仍然是如何并行执行 4 个划分的列表......有或没有流。
-
int a = 0, e = list.size(), c = e >>> 1, b = c >>> 1, d = e - b; executorService.invokeAll(Arrays.asList( Executors.callable(() -> list.subList(a, b) .forEach(action)), Executors.callable(() -> list.subList(b, c).forEach(action)), Executors.callable(() -> list.subList(c, d).forEach(action)), Executors.callable(() -> list.subList(d, e).forEach(action)) ));
标签: java multithreading java-stream