dan*_*n66 5 java forkjoinpool java-stream
在 Java 8 中,可以设置一个自定义的 forkJoinPool 以供并行流使用,而不是公共池。
forkJoinPool.submit(() -> list.parallelStream().forEach(x ->{...} ))
Run Code Online (Sandbox Code Playgroud)
我的问题是它在技术上是如何发生的?
流无论如何都不知道它已提交到自定义 forkJoinpool,并且无法直接访问它。那么最终如何使用正确的线程来处理流的任务呢?
我尝试查看源代码但无济于事。我最好的猜测是在提交时的某个时刻设置了一些 threadLocal 变量,然后由流稍后使用。如果是这样,为什么语言开发人员会选择这种方式来实现行为,而不是将池依赖注入到流中?
谢谢!
根据我读过的代码,决策仅基于触发计算的初始线程(在方法内部)做出ForkJoinTask::fork
,该线程实际上对触发此计算的线程进行检查(也在其文档中):
Thread.currentThread()) instanceof ForkJoinWorkerThread
Run Code Online (Sandbox Code Playgroud)
因此,如果 的实例ForkJoinWorkerThread
已启动此任务(这是您通过自定义获得的ForkJoinPool
),请使用池中已存在且此任务运行的任何内容;否则(如果它是一个不是 的实例的不同线程ForkJoinWorkerThread
)使用:
ForkJoinPool.common.externalPush(this);
Run Code Online (Sandbox Code Playgroud)
同样有趣的是,它ForkJoinWorkerThread
实际上是一个public
类,因此您可以在它的实例内开始计算,但仍然使用不同的池;虽然我还没有尝试过这个。
归档时间: |
|
查看次数: |
576 次 |
最近记录: |