我读了一篇关于fork-join framework in Java 7的好文章,其想法是,使用ForkJoinPool
和ForkJoinTask
,池中的线程可以从其他任务获取子任务,因此它可以使用较少的线程来处理更多的任务。ForkJoinPool和正常的ExecutionService之间的区别?
然后我试着用普通的ExecutorService
来做同样的工作,发现我不知道区别,因为当我向池提交一个新任务时,任务将在另一个可用线程上运行。
我可以告诉的唯一区别是,如果我使用ForkJoinPool
,我不需要将池传递给任务,因为我可以调用task.fork()
使其在另一个线程上运行。但与正常ExecutorService
,我必须通过池到任务,或使其成为一个静态,因此在任务内,我可以拨打电话pool.submit(newTask)
我想错过什么吗?
(可以从https://github.com/freewind/fork-join-test/tree/master/src查看居住码)
有几篇文章解释了这两种方法哪一种更适合不同类型的任务。据我记得,Fork-Join池对于递归类型的任务调度来说更好(并且安全)。在任务为同一个ExecutorService生成新任务(正在执行的任务)的情况下,如果ExecutorService池的大小不够大,死机概率很高。尽管叉加入池不是这种情况。 –