ForkJoinPool类中 submint 和invoke区别。麻烦各位老师指导,谢谢。
如果你翻看一下源码会发现,submit 和 execute 跟invoke的区别是 externalPush(task);以后没有task.join
这个join方法调用的作用是使主线程挂起等候task结果。
https://stackoverflow.com/questions/17881183/difference-between-execute-submit-and-invoke-in-a-forkjoinpool
这篇文章是一个对比例子,简单的说下面这个例子中如果使用fj.submit你的主线程由于不会等候子任务结果,它就直接结束了。但是invoke可以,因为它有那句join调用
public static void main (String []args)
{
ForkJoinPool fj = new ForkJoinPool();
fj.invoke(new RecursiveTaskActionThing(500));
}
具体来说,是因为线程池默认setDaemon(true),当你的程序出了main方法主线程就销毁了,相应的线程池里的Daemon线程也跟着销毁了
总结ForkJoinPool的三种task调用方式
execute(ForkJoinTask) 异步执行tasks,无返回值
invoke(ForkJoinTask) 有Join, tasks会被同步到主进程
submit(ForkJoinTask) 异步执行,且带Task返回值,可通过task.get 实现同步到主线程