有关Fork-Join框架的详细信息

时间:2012-04-11 09:24:19

标签: java fork-join

在Doug Lea的论文“A Java Fork / Join Framework”中:

http://gee.cs.oswego.edu/dl/papers/fj.pdf

在2.1工作窃取中他说:

  

当工作线程遇到连接操作时,会处理其他操作   任务,如果可用,直到目标任务被注意到   完成(通过isDone)。否则所有任务都将完成   阻塞。

所以有人可以具体告诉我这些“其他任务”来自哪里?他们来自其他workerthreads的任务队列吗?这是否意味着每当一个workerthread遇到一个连接调用时,它会继续“从其他线程窃取任务”而不是“跳到其自己队列中的其他任务”?

2 个答案:

答案 0 :(得分:2)

当有待处理的任务,其他线程的deques或来自新请求的提交队列时,“其他任务”可能来自其自己的双端队列。

join()是一个相当困难的过程。它涉及任务控制,即在活动处理和暂停等待某事时控制任务的能力。在应用程序中执行此操作通常不起作用。 (操作系统做得很好,Cilk,JCilk通过使用编译器/运行时来完成它。)当连接陷入工作线程时,Doug Lea使用“延续线程”。

答案 1 :(得分:0)

  

Fork/Join framework中的每个工作线程都有一个工作队列   使用Deque实现。

     

每次创建新任务(或子任务)时,都会将其推到头部   它自己的队列。任务完成任务并执行连接时   另一项尚未完成的任务,它运作聪明。该   线程从其队列的头部弹出一个新任务并开始执行   而不是睡觉(为了等待另一个任务完成)。   实际上,如果一个线程的队列是空的,那么该线程会弹出一个   来自队列尾部的任务属于另一个线程。这是   只不过是一种偷工作的算法。