Java线程池中的execute和submit
创始人
2024-05-22 02:11:06
0

一、概述

execute和submit都是线程池中执行任务的方法。

execute是Executor接口中的方法

public interface Executor {void execute(Runnable command);
}

submit是ExecuteService接口中的方法。

public interface ExecutorService extends Executor { Future submit(Callable task); Future submit(Runnable task, T result);Future submit(Runnable task);
}

通过源码可以看出execute方法无返回值,参数为Runnable对象。
submit方法有三个重载方法,都有Future类型的返回值,参数可以是Runnable对象,Callable对象,Runnable对象和一个其他类型的对象。

那么在执行过程中有异常抛出会怎么样呢,先说答案,execute方法会直接抛出异常,submit方法不会抛出异常,只有在通过Future的get方法获取结果的时候才会抛出异常,下面进行测试:

public class ExecutorTest1 {public static void main(String[] args) {ExecutorService executorService = Executors.newSingleThreadExecutor();ExecutorTest1 test1 = new ExecutorTest1();executorService.execute(() -> test1.say("execute方法"));executorService.submit(() -> test1.say("submit方法"));executorService.shutdown();}private void say(String msg){System.out.println(msg);throw new RuntimeException("抛出了异常:"+ msg);}
}

执行结果如下:

image.png
可见execute方法直接抛出了异常,submit方法只打印了参数没有抛出异常,下面测试使用Future的get方法获取结果:

public class ExecutorTest1 {public static void main(String[] args) {ExecutorService executorService = Executors.newSingleThreadExecutor();ExecutorTest1 test1 = new ExecutorTest1();executorService.execute(() -> test1.say("execute方法"));Future submitFuture = executorService.submit(() -> test1.say("submit方法"));try {Object o = submitFuture.get();System.out.println("这是submit的返回值:"+o);} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}executorService.shutdown();}private void say(String msg){System.out.println(msg);throw new RuntimeException("抛出了异常:"+ msg);}
}

结果如下:

image.png
可见使用submit方法时只有在使用Future的get方法时才会抛出异常,并且get方法也会抛出ExecutionException异常。
那么还有一个问题,如果线程中执行方法抛出的异常已经被捕获了,那么submit会怎么处理呢,其实在方法中如果异常已经被捕获了,那么就是方法的正常运行,有异常打印的话在执行的时候就会打印,不会等到调用Future的get方法时候才会打印。测试如下:

public class ExecutorTest1 {public static void main(String[] args) {ExecutorService executorService = Executors.newSingleThreadExecutor();ExecutorTest1 test1 = new ExecutorTest1();executorService.execute(() -> test1.say("execute方法"));Future submitFuture = executorService.submit(() -> test1.say("submit方法"));try {Object o = submitFuture.get();System.out.println("这是submit的返回值:"+o);} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}executorService.shutdown();}private void say(String msg){System.out.println(msg);try{throw new RuntimeException("抛出了异常:"+ msg);}catch (Exception e){e.printStackTrace();}}
}

结果如下:

image.png
可见execute和submit都正常执行了方法,Future的get方法也获取到了结果,因为say方法没有返回值,所以打印的结果是null。

二、结论

execute和submit的区别如下:

  1. execute是Executor接口的方法,submit是ExecuteService接口的方法。
  2. execute的入参是Runnable,submit的入参可以是Runnable、Callable、Runnable和一个返回值。
  3. execute没有返回值,submit有返回值。
  4. 方法中抛出异常,execute会直接抛出异常,submit会在获取结果的时候抛出异常,如果不获取结果,submit不抛出异常。




关于Future可以查看:
Java多线程:Future和FutureTask

之前文章:

HashMap源码解析(基于JDK1.8)

Java线程池详解

相关内容

热门资讯

我生病了小学作文【精简6篇】 我生病了小学作文 篇一我生病了前几天,我不知道怎么了,突然感觉身体不舒服。我感到头晕目眩,喉咙痛得像...
新学期新打算小学作文450字... 新学期新打算篇一:我要努力学习新的学期开始了,我制定了新的打算,那就是要努力学习。我相信只有努力学习...
我学会了西红柿炒鸡蛋小学作文... 我学会了西红柿炒鸡蛋小学作文 篇一我学会了西红柿炒鸡蛋上周,我学会了一道简单又美味的菜——西红柿炒鸡...
花朵的小学作文【最新3篇】 花朵的小学作文 篇一花朵的奇妙世界花朵是大自然的美丽礼物,它们以各种各样的颜色和形状装点着我们的环境...
小学生赏花的作文【通用4篇】 小学生赏花的作文 篇一春天是一个充满美丽花朵的季节,我非常喜欢春天。每当春天来临,我就会和家人一起去...
中秋之夜小学生作文【优选3篇... 中秋之夜小学生作文 篇一中秋之夜,月亮圆圆的,像一块白玉挂在天空中。我和爸爸妈妈一起出门,欣赏美丽的...
油面筋塞肉小学作文(推荐3篇... 油面筋塞肉小学作文 篇一我喜欢吃美食,尤其是一些特色的小吃。最近,我发现了一种非常好吃的小吃,那就是...
学游泳的小学作文(实用3篇) 学游泳的小学作文 篇一学游泳的小学作文大家好!我是小明,今天我要给大家分享一下我学游泳的经历。我是一...
小学生作文老师我想对你说【最... 小学生作文老师我想对你说 篇一尊敬的老师:您好!我是您的学生小明。我想借这篇作文向您表达我的感激之情...
一次有趣的实验小学生作文80... 一次有趣的实验篇一昨天,我参加了一次非常有趣的实验。老师让我们小组一起进行,我非常期待这个实验的结果...
春天小学一年级作文300字【... 春天小学一年级作文300字 篇一我的春天春天来了,大地上百花盛开,绿草如茵。我喜欢春天,因为春天是个...
校园的一角的作文【优选6篇】 校园的一角的作文 篇一校园的一角在校园的一角,有一个小花园,是我最喜欢的地方。虽然它不大,但却别有一...
参观科技馆的小学作文400字... 参观科技馆的小学作文400字 篇一:奇妙的科技世界我参观了我们学校附近的科技馆,这里展示了许多令人惊...
值得的学生作文【实用3篇】 值得的学生作文 篇一突破自我,迈向成功作为一名学生,我们应该时刻保持一种积极向上的心态,勇于追求进步...
走进直播间小学作文(最新4篇... 走进直播间小学作文 篇一近年来,随着互联网技术的快速发展,直播已经成为了一种非常流行的媒体形式。除了...
我的学校小学作文350字【精... 我的学校小学作文350字 篇一我所在的学校是一所小学,位于市区的中心地带。学校占地面积较小,但是设施...
春节大扫除小学作文【精选6篇... 春节大扫除小学作文 篇一:春节大扫除的乐趣春节是中国人最重要的传统节日之一,也是一年中家庭团聚最为频...
抓田螺小学作文(最新5篇) 抓田螺小学作文 篇一我和小伙伴们一起去抓田螺今天,天气晴朗,阳光明媚,我和几个好朋友决定一起去抓田螺...
送别的作文【推荐3篇】 送别的作文 篇一送别的作文 篇一人生中,不论是离别还是告别,都是一种成长的过程。无论是与亲人分离,还...
两个“可怜”作文(最新3篇) 两个“可怜”作文 篇一在生活中,我们常常会遇到一些让人心生怜悯的事情。这些事情或许是因为某些原因而导...