在使用java.util.concurrent下关于线程池一些类的时候,相信很多人和我一样,总是分不 清submit()和execute()的区别,今天从源码方面分析总结一下。
通常,我们通过Executors这个工具类提供多种方法来创建适合不同场景的线程池,这里就不 一一介绍了。
例如,创建可缓存线程池,Executors.newCachedThreadPool(),源码如下:
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor (0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue());
}
通过上面源码可以看出,该方法返回的是一个ExecutorService接口 ,而这个接口继承
Executor接口,Executor是最上层的,其中只包含一个execute()
方法:
public interface Executor {
void execute(Runnable command);
}
execute()方法的入参为一个Runnable,返回值为void,这时候我们已经知道了 execute()方 法的来源以及其定义。
接下来,我们来看看,submit() 从哪来的呢?
通过猜测,应该是ExecutorService接口中的,果然,打开源码,看到了 submit()方法:
public interface ExecutorService extends Executor {

Future submit(Callable task):
Future submit(Runnable task, T result);
Future<?> submit(Runnable task);

可以看出,在ExecutorService接口中,一共有以上三个sumbit()方法,入参可以为Callable, 也可以为Runnable,而且方法有返回值Future;
(补充说明:Callable与Runnable类似,也是创建线程的一种方式,实现其call()方法即可, 方法可以有返回值,而且方法上可以抛出异常;)
总结,从上面的源码以及讲解可以总结execute()和submit()方法的区别:
相同点:
相同点就是都可以开启线程执行池中的任务。
不同点:
1、 接收参数:execute()只能执行Runnable类型的任务,submit()可以执行Runnable和 Callable类型的任务。
2、 返回值:submit()方法可以返回持有计算结果的Future对象,而execute0没有
3、 异常处理:submit()方便Exception处理

Was this helpful?

0 / 0

发表回复 0

Your email address will not be published.