execute方法和submit方法是什么方法
这两个方法都是线程池ExecutorService接口的方法。作用都是 创建并执行子线程。
不需要传统的手动调用start方法开启线程。
从源码可以看出,ExecutorService接口是jdk1.5新增的接口,而且继承了Executor这个接口。
点击Executor接口进去发现这个接口就已经有了execute方法。
那表明submit方法即是ExecutorService自己的方法,并且从源码上看出这个方法是一个重载的方法。
那么从以上两个方法的源码上就可以比较的出有什么区别。
区别
参数不同
execute 只允许runnable接口入参,而submit方法允许callable和runable接口的入参
返回值不同
execute方法没有返回值。
submit方法可以自定义Future 接口的实现类对象的返回值,
而通常用的实现类是FutureTask这个类
异常捕获
execute 方法会在子线程中抛出异常,在主线程捕捉不到。
例如,以下代码上的37行捕获代码不能捕获子线程的异常。
(创建线程池可以用这个代码)
# 5 是线程池的容量
ExecutorService threadPool = Executors.newFixedThreadPool(5);
而,submit 方法不会直接抛出异常, 而是会将异常暂时存起来,等Future.get()方法的时候会抛出异常,然后主线程能捕获这些异常。
下面是没有调用get方法的情况,没有异常抛出
而调用了get方法后就会 抛出异常。
线程参数的返回值
execute方法的参数也可以传入FutureTask这个类对象。因为这个类实现了RunnableFuture接口,而RunnableFuture又实现了runnable接口,同时他的构造方法可以传入Callable接口的参数,因为Callable接口的call方法是有返回值的。
代码展示:
而submit方法因为可以传入Callable接口的参数,所以方法的传入submit方法的参数是可以有返回值的