在Doug Lea的论文“A Java Fork / Join Framework”中:
http://gee.cs.oswego.edu/dl/papers/fj.pdf
在2.1工作窃取中他说:
当工作线程遇到连接操作时,会处理其他操作 任务,如果可用,直到目标任务被注意到 完成(通过isDone)。否则所有任务都将完成 阻塞。
所以有人可以具体告诉我这些“其他任务”来自哪里?他们来自其他workerthreads的任务队列吗?这是否意味着每当一个workerthread遇到一个连接调用时,它会继续“从其他线程窃取任务”而不是“跳到其自己队列中的其他任务”?
答案 0 :(得分:2)
当有待处理的任务,其他线程的deques或来自新请求的提交队列时,“其他任务”可能来自其自己的双端队列。
join()是一个相当困难的过程。它涉及任务控制,即在活动处理和暂停等待某事时控制任务的能力。在应用程序中执行此操作通常不起作用。 (操作系统做得很好,Cilk,JCilk通过使用编译器/运行时来完成它。)当连接陷入工作线程时,Doug Lea使用“延续线程”。
答案 1 :(得分:0)
Fork/Join framework中的每个工作线程都有一个工作队列 使用Deque实现。
每次创建新任务(或子任务)时,都会将其推到头部 它自己的队列。任务完成任务并执行连接时 另一项尚未完成的任务,它运作聪明。该 线程从其队列的头部弹出一个新任务并开始执行 而不是睡觉(为了等待另一个任务完成)。 实际上,如果一个线程的队列是空的,那么该线程会弹出一个 来自队列尾部的任务属于另一个线程。这是 只不过是一种偷工作的算法。