3

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

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

在 2.1 Work-Stealing 中,他说:

当工作线程遇到连接操作时,它会处理其他任务(如果可用),直到发现目标任务已完成(通过 isDone)。否则,所有任务都会在没有阻塞的情况下运行完成。

那么谁能具​​体告诉我这些“其他任务”来自哪里?它们来自其他工作线程的任务队列吗?这是否意味着每当工作线程遇到连接调用时,它会继续“从其他线程窃取任务”而不是“跳到自己队列中的其他任务”?

4

1 回答 1

2

当有挂起的任务时,“其他任务”可能来自它自己的双端队列,其他线程的双端队列,或者来自新请求的提交队列。

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

于 2012-04-11T13:27:53.060 回答