关于 ForkJoin 例子有没有可以改进优化的地方?

来源:7-3 J.U.C-ForkJoin

慕大侠

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回答

Jimin

2018-03-31

你好,先说第一个问题,使用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的时候会阻塞。

祝你学习愉快~

0
1
慕大侠
谢谢老师 明白了
2018-03-31
共1条回复

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程