看过源码的同学会发现我们线程池提交任务除了submit方法外,在ThreadPoolExecutor类里还有excute方法,一样可以提交任务,那么这两个方法有什么区别?我们应该怎么选择用哪个方法?我看网上也有很多帖子,看了一些,大多写的不够深入,看了之后就是知其然而不知其所以然,所以今天决定自己翻翻源码,一探究竟,直接看源码
首先,我们查看源码里方法定义,很明显能发现2个区别:
1、submit方法有返回值,execute没有
2、submit方法可以是runnable和callable参数,execute只能是runnable
看到这里我们大概猜测这两个方法最大的区别应该就是返回值的问题了,那么这个返回值返回的是什么,我们应该怎么用,下面接着看
看下submit方法的实现,其实最终还是会调用execute,可以说是殊途同归啊,接着往下看:
到这里我们差不多明白了,这里是创建了一个Callable对象,并且设定了线程状态,回过头来看,其实submit调用execute方法入参就是FutureTask对象
下面我们接着看execute里面具体是做了什么
在addWorker方法里面,创建了一个Worker对象,最终启动Worker里的线程对象,接着看worker里面做了什么
注意:这个地方创建线程的时候入参是Worker对象本身
在这个init方法里,我们看到最终将Worker对象赋值给了target。所以在execute的addWorker方法后面启动的线程就是new 的那个Worker,看下worker里面run方法是怎么实现的
这个地方调用FutureTask的run()方法
run()里面调用Callable的call()方法,最后set(result)。到此,源码整个流程串完,我们大致也明白了submit是怎么个处理流程,知道了这些,那么我们再来看看,submit返回值Future的用法
我们来看看Future的get()方法
如果state值> COMPLETING ( COMPLETING 值为1),则返回state值,否则一直循环等待。然后调用report方法返回结果
可以看到这里的outcome就是前面FutureTaskrun()里面set的返回值,所以我们可以得出结论:
submit和execute这两个方法最大的区别应该就是返回值的问题,而submit返回值就是Callable的返回值,所以我们可以看出execute和submit的区别基本就是Callable和Runnable的区别了,所以应在哪种场景使用哪个方法可依据这个
至此线程池提交任务方法源码分析结束,如有不对的地方,欢迎大家指出一起探讨交流,谢谢
有参考其他博文,忘了是哪篇了。。。