当前位置: 首页 > 面试题库 >

ForkJoinPool似乎浪费了线程

白吕恭
2023-03-14
问题内容

我正在比较测试程序上的两个变体。两者都ForkJoinPool在具有四个内核的计算机上以4线程运行。

在“模式1”下,我非常类似于执行程序服务来使用池。我把一堆任务扔了进去ExecutorService.invokeAll。与普通的固定线程执行器服务相比,我获得了更好的性能(即使有对Lucene的调用,该调用在其中执行了一些I
/ O)。

这里没有分而治之。从字面上看,我知道

ExecutorService es = new ForkJoinPool(4);
es.invokeAll(collection_of_Callables);

在“模式2”中,我向池提交一个任务,然后在该任务中调用ForkJoinTask.invokeAll提交子任务。因此,我有一个继承自的对象RecursiveAction,并将其提交到池中。在该类的计算方法中,我invokeAll
另一个
类(也继承自)调用对象的集合RecursiveAction。出于测试目的,我一次只提交第一个对象。我天真地希望看到所有四个线程都忙,因为线程调用invokeAll将自己获取子任务之一,而不仅仅是坐着和阻塞。我可以想到某些原因导致它可能无法正常运行。

在模式2下的VisualVM中观看,几乎一个线程总是在等待。我希望看到的是,调用invokeAll的线程将立即在被调用的任务之一上工作,而不仅仅是停滞不前。这肯定比使用普通线程池尝试此方案所导致的死锁要好,但那又如何呢?它是否阻止了一个线程以防其他事情提交?而且,如果是这样,为什么在模式1下不会出现相同的问题?

到目前为止,我一直使用添加到Java 1.6的启动类路径中的jsr166 jar运行此程序。


问题答案:

ForkJoinTask.invokeAll正在分叉所有任务,但列表中的第一个。它自己运行的第一个任务。然后,它加入其他任务。它的线程不会以任何方式释放到池中。因此,您所看到的就是要完成其他任务的线程阻塞。



 类似资料:
  • 问题内容: 我正在尝试在我正在处理的Python项目中使用线程,但是线程似乎没有按照我的代码的预期运行。似乎所有线程都按顺序运行(即,线程2在线程1结束后开始,它们不是同时启动)。我编写了一个简单的脚本来对此进行测试,并且该脚本也按顺序运行线程。 这是我从运行它得到的输出: 循环的迭代次数更多时,观察到相同的行为。 我尝试搜索网络和较早的SO答案,但找不到任何有帮助的方法。有人可以指出这段代码有什

  • 我正在创建一个应用程序,用户在其中输入 7-10 个数值。然后,条目用于一个相当分层的公式,该公式向用户返回结果。两个值给我带来了麻烦,并产生了一个我无法弄清楚的数字。 从微调器中选择一个条目,因为只有4种可能的选择: 此选项不仅用于等式,还用于确定是否需要额外的信息。 获得IHCValue: 如果用户从此下拉列表中选择“2”,则下一个活动将要求 ,也用于等式的一部分: 获取FISHEntry:

  • 问题内容: 如果我在节点中编写以下程序: 然后在服务器上单击两次,在服务器上看到两次- 我不确定为什么单个HTTP请求导致两次执行。 问题答案: 那是正常现象-您的浏览器拨打了多个电话。 例如,大多数浏览器都会呼叫来获取。 尝试记录网址: 然后您会看到正在调用的内容。

  • 我正试图使Filepond工作,但CSS中的这一行似乎破坏了它-在ul选择器中。 我试着对页面的整个部分进行核化,直到Filepond起作用,将目标锁定在css上,最后在ul{}中找到前面提到的行。我可以把其他的东西都抹掉,只留下那条线,而文件孔仍然坏了,所以我肯定这是问题所在,但我不知道是怎么回事。 我尝试使用Chrome的检查器功能查看运行时页面源代码,但在那里找不到溢出。 然后我使用Note

  • 问题内容: 我用来为应用程序设置某个用户库的路径。但是如果我在此应用程序上设置功能 然后似乎被忽略了。当我启动程序时,Linux抱怨它找不到某个共享库。 我猜想有某种保护措施可以防止具有扩展权限的应用程序被劫持。有解决方法吗? 问题答案: 是的,出于安全原因已将其禁用。

  • 我在配置Spring MessageSource以忽略我的系统区域设置时遇到问题。当我使用null locale参数调用getMessage时,我希望我的MessageSource选择默认属性文件messages.properties.相反,它选择messages_en.properties.当我将此属性文件的名称更改为messages_fr.properties然后选择默认属性文件。我的系统区域