文章目录

  • 简介
  • 方法来源不同
  • 接收的参数不同
  • 返回值不同
  • 异常的处理

简介

在线程池的使用中,我们一般用ThreadPoolExecutor来创建线程池,创建好线程池后会将任务提交给线程池来执行。在提交任务的时候,JDK为我们提供了两种不同的提交方式,分别是submit()excute(),那么它们两者之间有什么不同呢?相互之间有什么关系呢?下面简单的介绍下

方法来源不同

execut()是在线程池的顶级接口Executor中定义的,而且只有这一个接口,可见这个方法的重要性。

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

ThreadPoolExecutor类中有它的具体实现。

submit()是在ExecutorService接口中定义的,并定义了三种重载方式,具体可以查看JDK文档


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

AbstractExecutorService类中有它们的具体实现,而ThreadPoolExecutor继承了AbstractExecutorService类,所以也有得到submit方法。

接收的参数不同

根据前面列出来的方法签名,可以知道:
execute()方法只能接收实现Runnable接口类型的任务
submit()方法则既可以接收Runnable类型的任务,也可以接收Callable类型的任务。
RunnableCallable的区别是 前者没有返回值,后者可以有返回值,于是这就又引出了下一个区别

返回值不同

execute()的返回值是void,线程提交后不能得到线程的返回值。
submit()的返回值是Future,通过Future的get()方法可以获取到线程执行的返回值,get()方法是同步的,执行get()方法时,如果线程还没执行完,会同步等待,直到线程执行完成。

虽然submit()方法可以提交Runnable类型的参数,但执行Future方法的get()时,线程执行完会返回null,不会有实际的返回值,这是因为Runable本来就没有返回值

下面是JDK中对submit(Runnable task)方法的描述:

 /*** Submits a Runnable task for execution and returns a Future* representing that task. The Future's {@code get} method will* return {@code null} upon <em>successful</em> completion.*/

异常的处理

通过查看任务的方法签名,
submit()执行Runnable/Callable的任务时,run()/call()方法没显式抛出异常。
execute()执行Runnable的任务时,run()方法有显式的抛出异常。
通过实验发现,用submit()提交任务,任务内有异常也不会打印异常信息。
用execute()方法执行任务,默认情况下,提交到线程池的任务,如果run()方法中有异常,会打印异常信息。
当调用Futureget()方法时,也能打印出任务执行异常信息。
所以,当用submit()提交线程时,run()orcall()方法尽量显式的catch异常,这样才不至于任务提交线程池后丢失异常信息。
测试代码如下:
两个线程:

class TestCallable implements Runnable {@Overridepublic void run()  { //try {  // 为了防止异常丢失,我们应该显式处理异常int a = 10 / 0;//} catch (Exception e) {//e.printStackTrace();//}}
}class TestCallable implements Callable<Integer> {@Overridepublic Integer call()  {// 为了防止异常丢失,我们应该显式处理异常int a = 10 / 0;return 1;}
}

测试主类:

public static void main(String[] args) {ExecutorService executorService = Executors.newFixedThreadPool(2);// 在线程的执行方法里如果没有异常处理,以下几个都不会有异常信息打印,只要不调用Future的get方法
//        executorService.submit(new TestRunnable());
//        executorService.submit(new TestCallable());
//        Future<?> future = executorService.submit(new TestRunnable());
//        Future<Integer> future1 = executorService.submit(new TestCallable());// 下面才会打印异常信息// executorService.execute(new TestRunnable());Future<Integer> future2 = executorService.submit(new TestCallable());try {future2.get();} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}}

以上就是关于线程池中execute()submit()的不同介绍,如有错误请大家多多指正。

线程池提交执行任务中execute()方法和submit()的区别相关推荐

  1. PreparedStatement 的 execute方法和executeUpdate方法区别

    方法executeUpdate 用于执行 INSERT.UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE.INSE ...

  2. JAVA编码(41)—— 线程池队列执行任务(ThreadPoolQueue)(1)

    废话少说,上代码 package com.sinosoft;import java.util.concurrent.*;/*** Created by xushuyi on 2017/4/9.*/ p ...

  3. 线程池提交任务不执行任务的相关问题

    在项目中为了提高接口的响应速度我经常会使用多线程来解决这个问题,在最近的一个项目,自己创建了一个线程池,并将它交给了spring容器来进行管理,在需要的地方来进行注入使用. 我在定时任务中使用了这个线 ...

  4. 线程池的执行原则及配置参数详解

    池是一种非常优秀的设计思想,通过建立池可以有效的利用系统资源,节约系统性能.Java 中的线程池就是一种非常好的实现,从 JDK 1.5 开始 Java 提供了一个线程工厂 Executors 用来生 ...

  5. java中线程池的使用_Java中线程池的简单使用

    什么是线程池? 顾名思义线程池就是线程的容器 举个例子:在没有共享电源的年代,车站有5个人手机都没电且都没有带电源,这五个人想要给手机充电只能去车站的售货亭各花100块钱买一个移动电源:但是现在共享电 ...

  6. 如何判断线程池已经执行完所有任务了?

    作者 | 磊哥 来源 | Java面试真题解析(ID:aimianshi666) 转载请联系授权(微信ID:GG_Stone) 很多场景下,我们需要等待线程池的所有任务都执行完,然后再进行下一步操作. ...

  7. springboot 使用spring的线程池异步执行

    springboot异步执行 1.启动类在这里插入代码片 @SpringBootApplication public class ThreadStudyApplication {public stat ...

  8. java线程池延期执行一次_Java使用者的延期执行

    java线程池延期执行一次 在前面的博客文章(" 延迟执行Java的供应商 "),我引用礁HORSTMANN的陈述书中' 的Java SE8为真的很急关于lambda表达式','所 ...

  9. 记一次线程池任务执行异常

    记一次线程池任务执行异常 参考文章: (1)记一次线程池任务执行异常 (2)https://www.cnblogs.com/hapjin/p/10012435.html (3)https://www. ...

  10. ThinkPHP 中M方法和D方法的具体区别

    M方法和D方法的区别 ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法 用于高效实例化一个基础模型类,而 D方法 用于实例化一个用户定义模型类. 使用M方法 如果是如下情况,请考虑使用 ...

最新文章

  1. php mysql sample,GitHub - BensonWuu/php-apache-mysql-sample
  2. linux服务器性能监控命令汇总之iostat命令(三)
  3. Lookup Relationship与Master-Detail Relationship的关系 || formula的特性|| picklist在代码编写时的注意事项
  4. Java黑皮书课后题第5章:*5.42(金融应用:求销售额)如下重写编程练习题5.39:①使用for循环替代do-while循环②允许用户自己输入COMMISSION_SOUGHT而非将它固定为常量
  5. linux之cut命令使用和总结
  6. 蓝桥杯2017初赛-k倍区间-前缀和
  7. ASP.Net学习笔记010--加法计算器
  8. [SDOI2015] 序列统计
  9. redis基础学习(一)— 配置项
  10. Moss 2007 升级到 Moss2010 成功但界面仍然保持07?
  11. 【Vim命令大全】史上最全的Vim命令
  12. 设计模式之GOF23代理模式02
  13. 华三交换机如何进入配置_h3c交换机配置telnet配置教程
  14. python使用Speech_Recognition实现普通话识别(一)
  15. win8 配置要求
  16. Minecraft——Forge1.16.5模组开发(36.2.20)——(3)第一个实体方块
  17. 可折叠的table表格
  18. 楚汉骄雄之楚汉争雄 - 分集剧情介绍
  19. 斯坦福博士退学,在 3 个领域改变世界,科技狂人马斯克的巅峰之路
  20. 计算机等级ps考试1试题,计算机等级考试一级PS考前试题及答案一

热门文章

  1. Win10 System进程占用硬盘100%,Microsoft IME 占用CPU高
  2. CText更新至V1.1.0
  3. 大数据新闻推送你怎么看_如何看待大数据精准推送,使人的视界越来越窄?
  4. 译文|Apache Pulsar 如何保证消息不丢不重?
  5. R语言学习:缺失值处理
  6. 把系统桌面设置到D盘
  7. c语言怎么输入若干整数,//从键盘上输入若干整数,并将其存入数组中,并统计输入数据的个...
  8. 中山大学非全日制计算机考研,中山大学社会工作非全日制考研经验贴
  9. 一条命令解决macmnsvc.exe占用8081端口的问题
  10. 0.5mm的焊锡丝能吃多大电流_【高考必备】高考物理5大类型的实验要点整理,考前一定要看!...