Bil*_*oor 6 java multithreading fork-join
在a中ForkJoinPool ForkJoinTask,当前工作线程是否参与工作窃取?
我已经读到了fork连接池可以从阻塞或等待线程中窃取的含义.目前的工人似乎是一个明显的候选人 一旦工作人员调用.join()另一个任务,那么该任务基本上被阻止.
另一方面,我看到许多文章暗示了不同的结论.例如,当前工作者线程在等待分叉任务之前应该工作的普遍共识.
有迹象表明,讨论使用的几篇文章ForkJoinTask.getSurplusQueuedTaskCount,通过具有当前工人平衡在队列中的工作方法做了一些工作.如果当前工人也在偷窃,那么这似乎没有必要.
当然,我希望最大化线程操作并使所有工作者最大限度地运行.了解当前线程是否也窃取工作(例如何时.join被调用)将有助于澄清.
ForkJoinPool 负责管理线程。客户端代码应该为其提供任务,而不是对线程进行微观管理。请注意,任务和线程是两个不同的东西;任务是要执行的工作单元,线程执行该工作。
如果任务足够大,可以从并行运行部分任务中受益,则 ForkJoinTask.compute() 应该 fork() 成更小的子任务;如果任务足够小,最好在单线程中运行,则只需处理该任务。如果工作结果超出预期,它可以 fork() 部分工作并完成其余工作。
如果 ForkJoinTask.compute() 分叉成更小的子任务,它可以在返回之前调用 join()。然后,ForkJoinPool 将释放该线程来处理其他任务,或者生成一个临时线程来处理其他任务,以确保充分利用可用的并行性。
我认为只要有未完成的任务,就可以合理地假设适当数量的工作线程保持忙碌状态,除非您在compute()方法中显式阻止线程。
Sun 教程提供了有关如何使用这些类的更多详细信息:
https://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html
| 归档时间: |
|
| 查看次数: |
99 次 |
| 最近记录: |