java - Java 8 并行流是否对序列使用相同的线程

标签 java java-8 java-stream

假设我们有这样的东西:

LongStream.range(0, 10).parallel()
.filter(l -> {
  System.out.format("filter: %s [%s]\n", l, Thread.currentThread().getName());
  return l % 2 == 0;
})
.map(l -> {
  System.out.format("map:    %s [%s]\n", l, Thread.currentThread().getName());
  return l;
});

如果你运行这个程序输出会是这样的:

filter: 6 [main]
map:    6 [main]
filter: 5 [main]
filter: 4 [ForkJoinPool.commonPool-worker-2]
map:    4 [ForkJoinPool.commonPool-worker-2]
filter: 1 [ForkJoinPool.commonPool-worker-3]
filter: 2 [ForkJoinPool.commonPool-worker-1]
filter: 0 [ForkJoinPool.commonPool-worker-3]
filter: 3 [ForkJoinPool.commonPool-worker-2]
filter: 8 [main]
filter: 7 [ForkJoinPool.commonPool-worker-2]
filter: 9 [ForkJoinPool.commonPool-worker-2]
map:    0 [ForkJoinPool.commonPool-worker-3]
map:    2 [ForkJoinPool.commonPool-worker-1]
map:    8 [main]`

正如我们所见,每个 long 的每个任务序列都由同一个线程执行。这是我们可以依靠的东西,还是只是巧合?线程可以在执行期间“共享”任务吗?

最佳答案

来自 stream package summary关于副作用的部分:

If the behavioral parameters do have side-effects, unless explicitly stated, there are no guarantees as to the visibility of those side-effects to other threads, nor are there any guarantees that different operations on the "same" element within the same stream pipeline are executed in the same thread.

关于java - Java 8 并行流是否对序列使用相同的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36609417/

相关文章:

java - Spring Data JPA/OpenJPA : Is there an equivalent to SQL ! =-运算符

java - 如何区分importData中的复制/移动

java - 我试图在执行时在 android 中创建一个注册 Activity ,控制进入注册方法,之后控制停止

java Date(long) 没有意义.. long 不足以存储当前日期(以毫秒为单位)

java - 如何根据 Collection 值的大小对 Map 进行排序?

java - 将枚举列表转换为具有匹配枚举值的逗号分隔字符串

java - 收到致命警报 : protocol_version build failure Gradle/Maven

java - 如何使用 Streams 在 Java 8 中将 HashMap 转换为 K/V 字符串

Java 8 数组流过滤器

java - 如何使用 Java 8 Stream/Lambda 计算整数中尾随零的数量?