【发布时间】:2017-04-27 10:25:29
【问题描述】:
Java Streams 的并行度取决于您的硬件。但是,如果我想始终拥有最大的并行度怎么办?
考虑下面的代码。我希望这 10 个任务中的每一个都同时运行 100 毫秒。
long runUntil = System.currentTimeMillis() + 100;
IntStream.range(0, 10).parallel().forEach(i ->
{
int cnt = 0;
while(System.currentTimeMillis() < runUntil)
cnt++;
System.out.println(i + ": " + cnt);
});
但是,我得到的结果是:
2: 56443
1: 67506
4: 74693
6: 70549
0: 0
3: 0
5: 0
7: 0
8: 0
9: 0
所以只有 4 个任务并行执行,而第 5 个任务只有在前 4 个任务之一完成时才开始。我希望所有任务大约在同一时间开始,而不是互相等待。
我不同意它是 Custom thread pool in Java 8 parallel stream 的副本,因为这个问题是关于运行缓慢的任务会阻塞其他任务,而就我而言,我只想知道如何(如果可以的话)最大化并行性使用 Stream API 时。
【问题讨论】:
-
预期结果是什么?
-
看起来你有 4 个核心。
-
'同时运行 100 毫秒':您希望所有任务 a) 同时开始,还是 b) 每个任务在运行 100 毫秒后才完成?
-
@wvdz 如果您要采用的解决方案是 java.util.concurrent.ForkJoinPool.common.parallelism = 10,那可能是 非常错误的。 你正在做的是为整个应用程序启用并行性,这不是很好。每次您要使用并行流或时,将使用 forkjoinpool(在您无法控制的地方)将使用 10 个线程。您可能想分享您想要实现的确切目标。
-
@StoyanDekov 我不同意它是完全重复的。用例不同。我真的很想同时执行所有事情。对链接问题的最高投票答案不是我的问题的解决方案。
标签: java java-stream