当前位置: 首页 > 知识库问答 >
问题:

并行流如何“知道”使用封闭的ForkJoinPool?

施同
2023-03-14

在Java8中,可以设置一个定制的forkJoinPool供并行流使用,而不是公共池。

forkJoinPool.submit(() -> list.parallelStream().forEach(x ->{...} ))

我的问题是它在技术上是如何发生的?
流以任何方式都不知道它被提交给了自定义的forkJoinpool并且没有直接访问它的权限。那么最终如何使用正确的线程来处理流的任务呢?

我试着看源代码,但没有用。我的最佳猜测是在提交时的某个点设置了某个threadLocal变量,然后在稍后由流使用。如果是这样的话,为什么语言开发人员会选择这样一种方式来实现行为,而不是将池注入流中的依赖关系呢?

共有1个答案

郭洋
2023-03-14

根据我阅读的代码,决策仅基于触发计算的初始线程,方法ForkJointAsk::Fork中的线程,该方法实际上会检查触发计算的线程(也在其文档中):

Thread.currentThread()) instanceof ForkJoinWorkerThread

因此,如果ForkJoinWorkerThread的一个实例启动了此操作(这是您将通过自定义的ForkJoinPool获得的),则使用已存在的池并在其中运行此任务;否则(如果是不是ForkJoinWorkerThread实例的其他线程),请使用:

ForkJoinPool.common.externalPush(this); 

同样有趣的是,ForkJoinWorkerThread实际上是一个Public类,因此您可以在它的实例中启动计算,但仍然使用不同的池;虽然我没有试过。

 类似资料:
  • 在Java8中,可以设置一个自定义forkJoinpool,由并行流而不是公共池使用。 我的问题是技术上是如何发生的 流在任何方面都不知道它已提交到自定义forkJoinpool,并且无法直接访问它。那么,最终如何使用正确的线程来处理流的任务呢? 我试着看源代码,但没有用。我的最佳猜测是在提交时的某个点设置了一些threadLocal变量,然后流在稍后使用。如果是这样,为什么语言开发人员会选择这样

  • 问题内容: 我正在实现一个小型TCP服务器。我怎么知道我的一位客户是否关门?我应该只是尝试读取或写入并检查是否为零? 问题答案: 该线程“ 的最佳方式可靠地检测TCP连接被关闭 ”,使用了“ ”(也可见于或或许多其他情况下): 为了检测超时,建议: 更新2019:tuxedo25在评论中提到: 在Go 1.7+中,零字节读取立即返回,并且永远不会返回错误。 您必须读取至少一个字节。 参见commi

  • 本文向大家介绍如何知道对象是否用JavaScript密封?,包括了如何知道对象是否用JavaScript密封?的使用技巧和注意事项,需要的朋友参考一下 Object.isSealed()是用于查找对象是否在javascript中密封的方法。此方法给出布尔输出。  如果满足以下条件,则将对象密封。 1)不可扩展。 2)其属性应不可配置。 语法 参数  -Object.isSealed()将对象作为参

  • 问题内容: 我们在某些工作中动态创建并行步骤。感谢这个线程,我找到了如何动态创建带有并行步骤中使用的参数的地图。 但是,现在我想重用用于创建这些并行步骤的部分代码。为此,我觉得我需要关闭这些内容。 但是,currying似乎无法正常工作。引用闭包内部的循环变量(valueCopy)做正确的事,但是currying并没有达到我的期望。 我做错什么了吗?是否还不支持?有没有解决方法?这可能是詹金斯管道

  • 我想学习使用英特尔的Haswell CPU微架构的并行编程。关于在ASM/C/C++/(任何其他langs)中使用SIMD:SSE4.2,AVX2?。你能推荐书籍,教程,网络资源,课程吗?

  • 问题内容: 我在Linux Ubuntu服务器中搜索php.ini文件所在的路径,并且在执行命令时发现很多php.ini 。那么如何从php.ini所在的php脚本网页中确切地知道呢? 问题答案: 您可以使用php_ini_loaded_file() 取自php.net: 您可能还需要检查php_ini_scanned_files() 另外,您应该注意,如果从CLI运行PHP脚本,则有可能使用与服