关于 ForkJoin 例子有没有可以改进优化的地方?
来源:7-3 J.U.C-ForkJoin
![](http://img1.sycdn.imooc.com/user/54584f9d0001219b02200220-100-100.jpg)
慕大侠
2018-03-31
老师 , 我在学习 ForkJoin 的时候 看到了 廖雪峰老师的一篇文章 , 不知道老师有没有看过这篇文章 , 链接在这里 https://www.liaoxuefeng.com/article/001493522711597674607c7f4f346628a76145477e2ff82000 他在文章中提到 我们在课程中的实例不妥 ,他认为我们的这种写法不符合Fork/Join模型的任务执行逻辑, 老师怎么看 , 还是说我对两位老师的代码示例理解有误 , 他在文章中使用的 invoke 提交 task 的 , 我搜索了一下别人对invoke 和 submit 的解释 , 感觉都不是很明白 , 我想问问 invoke 和 submit 有什么区别 , 什么情况下适合使用 submit , 什么情况下适合使用 invoke
烦请老师有空帮忙解答 , 谢谢!
protected Long compute() { if (任务足够小?) { return computeDirect(); } // 任务太大,一分为二: SumTask subtask1 = new SumTask(...); SumTask subtask2 = new SumTask(...); // 分别对子任务调用fork(): subtask1.fork(); subtask2.fork(); // 合并结果: Long subresult1 = subtask1.join(); Long subresult2 = subtask2.join(); return subresult1 + subresult2; }
1回答
-
你好,先说第一个问题,使用fork方法不是最高效的,这个确实如此,关于这个问题,网上很多文章也在说,比如:https://blog.csdn.net/cxl0921/article/details/76460909 ,https://www.cnblogs.com/Redvelvet/p/4918307.html 。那么,既然fork不是最高效的,为什么还要用他来举例子呢,就ForkJoin而言,直接使用fork、join两个方法来举例子大家更容易理解也更容易记住他。提到ForkJoin,你可能直接就会想起这两个方法以及能解决的问题。随着学习的深入,invokeAll就出现了,相比fork,他可以更好的利用线程池,实际表现也更好。因为ForkJoin大家平时用的并不多,因此课程在ForkJoin这里没打算讲太多的细节,不过,课程里如果直接给出invokeAll的对比,效果应该会更好些。
再来说一下这里submit和invoke的区别。invoke是同步执行,调用之后需要等待任务完成,才能执行后面的代码;submit是异步执行,只有在Future调用get的时候会阻塞。
祝你学习愉快~
012018-03-31
相似问题