我想了解在 Java fork-join 池中处理任务的顺序。
到目前为止,我在文档中找到的唯一相关信息是关于名为“asyncMode”的参数,“如果此池对从未加入的分叉任务使用本地先进先出调度模式,则为真” .
我对这句话的理解是每个worker都有自己的任务队列;工作人员从自己队列的前面获取任务,如果自己的队列为空,则从其他工作人员的队列后面窃取任务;如果 asyncMode 为真(相应的假),工作人员会将新分叉的任务添加到他们自己队列的后面(相应的前面)。
如果我的解释有误,请纠正我!
现在,这提出了几个问题:
1)加入的分叉任务的顺序是什么?
我的猜测是,当一个任务被分叉时,它会被添加到工作人员的队列中,如我上面的解释中所述。现在,假设任务已加入...
如果在调用 join 时任务尚未启动,则调用 join 的 worker 会将任务从队列中拉出并立即开始处理它。
如果在调用 join 时该任务已被另一个 worker 窃取,则调用 join 的 worker 将同时处理其他任务(按照我上面解释中描述的获取任务的顺序),直到它被加入已经被偷走它的工人完成了。
这个猜测是基于用打印语句编写简单的测试代码,并观察改变连接调用顺序影响任务处理顺序的方式。有人可以告诉我我的猜测是否正确?
2) 外部提交的任务排序是什么?
根据这个问题的答案,fork-join 池不使用外部队列。(顺便说一下,我正在使用 Java 8。)
那么我是否理解在外部提交任务时,该任务会被添加到随机选择的工作队列中?
如果是,外部提交的任务是加在队列的后面还是前面?
最后,这取决于任务是通过调用 pool.execute(task) 还是通过调用 pool.invoke(task) 提交?这是否取决于调用 pool.execute(task) 或 pool.invoke(task) 的线程是外部线程还是此 fork-join 池中的线程?
皈依舞
相关分类