java submit execute_ExecutorService中submit()和execute()的区别

在使用java.util.concurrent下关于线程池一些类的时候,相信很多人和我一样,总是分不清submit()和execute()的区别,今天从源码方面分析总结一下。

通常,我们通过Executors这个工具类提供多种方法来创建适合不同场景的线程池,这里就不一一介绍了。

例如,创建可缓存线程池,Executors.newCachedThreadPool(),源码如下:

public staticExecutorService newCachedThreadPool() {return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue());

}

通过上面源码可以看出,该方法返回的是一个ExecutorService接口,而这个接口继承Executor接口,Executor是最上层的,其中只包含一个execute()

方法:

public interfaceExecutor {

voidexecute(Runnable command);

}

execute()方法的入参为一个Runnable,返回值为void,这时候我们已经知道了execute()方法的来源以及其定义。

接下来,我们来看看,submit()是从哪来的呢?

通过猜测,应该是ExecutorService接口中的,果然,打开源码,看到了submit()方法:

public interface ExecutorService extendsExecutor {

... Future submit(Callabletask); Futuresubmit(Runnable task, T result);

Future>submit(Runnable task);

...

}

可以看出,在ExecutorService接口中,一共有以上三个sumbit()方法,入参可以为Callable,也可以为Runnable,而且方法有返回值Future;

(补充说明:Callable与Runnable类似,也是创建线程的一种方式,实现其call()方法即可,方法可以有返回值,而且方法上可以抛出异常;)

总结,从上面的源码以及讲解可以总结execute()和submit()方法的区别:

1.接收的参数不一样;

2. submit()有返回值,而execute()没有;

例如,有个validation的task,希望该task执行完后告诉我它的执行结果,是成功还是失败,然后继续下面的操作。

3. submit()可以进行Exception处理;

例如,如果task里会抛出checked或者unchecked exception,而你又希望外面的调用者能够感知这些exception并做出及时的处理,那么就需要用到submit,通过对Future.get()进行抛出异常的捕获,然后对其进行处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值