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

当前工人是否参与偷窃工作?

姜志行
2023-03-14

在< code > ForkJoinPool < code > ForkJoinTask 中,当前工作线程是否参与工作窃取?

我已经读到分叉连接池可以从阻塞或等待的线程中窃取的含义。目前的工人似乎是一个明显的候选人。一旦工作线程在另一个任务上调用 .join(),则该任务基本上被阻止。

另一方面,我看到许多暗示不同结论的文章。例如,当前工作线程应该在等待分叉任务之前完成工作的普遍共识。

有几篇文章讨论了使用ForkJoinTask.getSurplusQueuedTaskCount作为一种方法,通过让当前工作人员完成一些工作来平衡队列中的工作。如果当前工作人员也在偷窃,那么这似乎没有必要。

自然,我希望最大化线程操作,并最大限度地保持所有工作线程的运行。了解当前线程是否也窃取工作(例如当< code >。join被调用)将有助于阐明。

共有1个答案

邵俊才
2023-03-14

ForkJoinPool负责管理线程。客户机代码应该提供it任务,而不是微管理线程。注意,任务和线程是两个不同的东西;任务是要执行的工作单元,线程执行该工作。

ForkJoinTask。如果任务足够大,可以从并行运行部分任务中获益,则compute()应将()分叉成更小的子任务,如果任务足够小,最好在单个线程中运行,则只处理该任务。如果工作结果超出预期,它可以fork()一些工作并完成其余工作。

如果ForkJoinTask.compute()分叉成更小的子任务,它可以在返回之前调用join()。然后,ForkJoinPool将释放线程来处理其他任务,或者生成一个临时线程来处理其他任务,以确保可用的并行性得到充分利用。

我认为只要有未完成的任务,适当数量的工作线程就保持忙碌是合理的,除非您在compute()方法中显式阻塞线程。

Sun 教程提供了有关如何使用这些类的更多详细信息:

https://docs . Oracle . com/javase/tutorial/essential/concurrency/html" target="_blank">fork join . html

 类似资料:
  • 我正在创建kubernetes集群,其中包括:1个主节点(M1),2个工作节点(W1和W2) 使用部署创建副本数为5的吊舱。

  • 例如,工作窃取在Java平台上的Fork/Join框架中可用。(请参阅fork/Join框架如何比线程池更好?)-OmniThreadLibrary是否可能有类似的东西? 工作窃取:工作线程用完了要做的事情,可以从其他仍然繁忙的线程中窃取任务。

  • 我试图理解工作窃取对递归任务的影响:工作窃取的一个优点是,当前的工作线程/线程可能会执行自己的生成任务;增加数据局部性。但是,在常见情况下,当工作线程加入其生成的任务时会发生什么?例如: 我认为这里当前线程会被阻塞,因此无法从自己的队列中获取工作,因此另一个工作人员将不得不窃取这些工作。这将否认工作窃取的局部优势。然而,根据维基百科(https://en.wikipedia.org/wiki/Wo

  • 问题内容: 是否有必要在Procfile中提供“工人”信息?如果是,那么实际上是什么- 找不到关于此的漂亮文章。我希望你们有想法。我已经在Procfile中添加了web:节点server / server.js详细信息。任何帮助,将不胜感激! 问题答案: Procfile是一种机制,用于声明应用程序的dyno在Heroku平台上运行的命令。 从Process Types和Procfile开始 ,这

  • 我试图理解fork-join的窃取部分。fork-join池具有具有自己Deque的工作线程。如果工作线程自身的deque为空,则该线程从另一个工作线程中窃取。 线程如何访问其他线程的状态? 当所有者线程和窃取者线程尝试访问取消排队中的同一项目时,它不会产生同步问题吗?

  • 是浏览器中可用的事件。服务工作者代码是否支持没有DOM访问权限的等效事件? 我看到的所有示例代码都在处理请求的过程中检查网络状态。为了向服务器或云提交本地更新,最好立即响应网络可用性。 我能找到的最好的文档是https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerGlobalScope它只列出了这些事件: 激活 其中,sync看起