【发布时间】:2021-05-25 20:32:54
【问题描述】:
这是我的代码:
list.stream()
.parallel()
.map(cpcP -> this.myDao.myOperation(cip, cpcP))
.collect(Collectors.toList());
在myOperation里面我写了一个日志:
log.debug("{} -> {}", Thread.currentThread().getName(), ...);
我正在获取这些日志:
ForkJoinPool.commonPool-worker-3 -> ...
ForkJoinPool.commonPool-worker-3 -> ...
ForkJoinPool.commonPool-worker-3 -> ...
ForkJoinPool.commonPool-worker-3 -> ...
ForkJoinPool.commonPool-worker-3 -> ...
ForkJoinPool.commonPool-worker-3 -> ...
ForkJoinPool.commonPool-worker-3 -> ...
ForkJoinPool.commonPool-worker-3 -> ...
...
它似乎总是使用同一个线程。
有什么想法吗?
【问题讨论】:
-
list.parallelStream() 怎么样?
-
我相信流 api 将“检测”流实际上是否足够大以保证分成多个流,或者可以由单个线程快速完成。不过我不知道标准。
-
@markspace 它不会检测到,但是如果启动线程在其他线程甚至开始工作之前完成了它的工作,那么第一个线程将继续处理另一个块,所以在最极端的情况下它可能会完成所有在其他线程设法做出贡献之前的工作。另一种可能的情况是具有有限并行处理能力的源列表,例如使用
LinkedList时。 -
其他可能:其他工作线程正忙于其他并行操作。
-
并行流使用
ForkJoinPool.common(),因此很可能在您的应用程序中该公共池还有其他用途,而您的操作只能获得一个线程。
标签: java java-stream