通过代码示例了解submit与execute的区别

 更新时间:2020年09月30日 09:30:59   作者:沐春风-燕南飞  
这篇文章主要介绍了通过代码示例了解submit与execute的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

(1)可以接受的任务类型

submit:

execute:

可以看出:

execute只能接受Runnable类型的任务

submit不管是Runnable还是Callable类型的任务都可以接受,但是Runnable返回值均为void,所以使用Future的get()获得的还是null

(2)返回值

由Callable和Runnable的区别可知:

execute没有返回值

submit有返回值,所以需要返回值的时候必须使用submit

(3)异常

1.execute中抛出异常

execute中的是Runnable接口的实现,所以只能使用try、catch来捕获CheckedException,通过实现UncaughtExceptionHande接口处理UncheckedException

即和普通线程的处理方式完全一致

2.submit中抛出异常

不管提交的是Runnable还是Callable类型的任务,如果不对返回值Future调用get()方法,都会吃掉异常

先来看下Callable定义

public interface Callable<V> {
V call() throws Exception;
}

其中的call能够抛出Exception异常,所以不管是CheckedException还是UncheckedException,直接抛出即可

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
 
public class ThreadExceptionTest {
  public static void main(String[] args) {
    ExecutorService executor = Executors.newCachedThreadPool();
    
    Future<Boolean> future = executor.submit(new CallableTask());
    try {
      future.get();
    } catch (InterruptedException e) {
      e.printStackTrace();
    } catch (ExecutionException e) {
      e.printStackTrace();
    }
    
    executor.shutdown();//必须不能忘,否则会一致卡在那里
  }
}
 
class CallableTask implements Callable<Boolean>{
  public Boolean call() throws Exception {
//    InputStream in = new FileInputStream(new File("xx.pdf"));
    int num = 3/0;
    return false;
  }
  
}

结果为:

java.util.concurrent.ExecutionException: java.lang.ArithmeticException: / by zero
  at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222)
  at java.util.concurrent.FutureTask.get(FutureTask.java:83)
  at my.ThreadExceptionTest.main(ThreadExceptionTest.java:21)
Caused by: java.lang.ArithmeticException: / by zero
  at my.CallableTask.call(ThreadExceptionTest.java:57)
  at my.CallableTask.call(ThreadExceptionTest.java:1)
  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
  at java.util.concurrent.FutureTask.run(FutureTask.java:138)
  at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
  at java.lang.Thread.run(Thread.java:619)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java中使用装饰设计模式实现动态增强对象功能

    Java中使用装饰设计模式实现动态增强对象功能

    装饰设计模式是Java中一种常用的设计模式,它通过动态地将功能透明地附加到对象上,以扩展对象的功能。装饰设计模式主要应用于需要动态、透明地增强对象功能的场景。在Java中,装饰设计模式可通过继承、接口和代理等方式实现
    2023-04-04
  • SpringCloud中的@RefreshScope注解与使用场景方式

    SpringCloud中的@RefreshScope注解与使用场景方式

    SpringCloud中的@RefreshScope注解用于动态刷新Bean配置,解决外部配置变化时的问题,避免重启应用,通过本文的详细介绍,希望读者能够更好地掌握@RefreshScope的使用技巧,在实际项目中灵活应用,提升微服务应用的动态配置管理能力
    2024-12-12
  • SpringBoot导出Excel的四种实现方式

    SpringBoot导出Excel的四种实现方式

    近期接到了一个小需求,要将系统中的数据导出为Excel,且能将Excel数据导入到系统,对于大多数研发人员来说,这算是一个最基本的操作了,本文就给大家总结一下SpringBoot导出Excel的四种实现方式,需要的朋友可以参考下
    2024-01-01
  • Mybatis-Plus中的@TableName 和 table-prefix使用

    Mybatis-Plus中的@TableName 和 table-prefix使用

    table-prefix 是一个全局配置,它会自动在所有表名前添加指定的前缀,这个配置对于那些使用一致命名约定的数据库表非常有用,这篇文章主要介绍了Mybatis-Plus中的@TableName 和 table-prefix使用,需要的朋友可以参考下
    2024-08-08
  • Mybatis-plus操作json字段实战教程

    Mybatis-plus操作json字段实战教程

    这篇文章主要介绍了Mybatis-plus操作json字段实战教程,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • 详解Java 序列化与反序列化(Serialization)

    详解Java 序列化与反序列化(Serialization)

    这篇文章主要介绍了Java 序列化与反序列化(Serialization),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习 吧
    2019-03-03
  • Spring中获取Bean对象的三种注入方式与两种注入方法详解

    Spring中获取Bean对象的三种注入方式与两种注入方法详解

    平常的Java开发中程序员在某个类中需要依赖其它类的方法,下面这篇文章主要给大家介绍了关于Spring中获取Bean对象的三种注入方式与两种注入方法的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • spring boot actuator监控超详细教程

    spring boot actuator监控超详细教程

    Spring Boot Actuator就是一款可以帮助你监控系统数据的框架,其可以监控很多很多的系统数据,接下来通过本文给大家介绍spring boot actuator监控超详细教程,感兴趣的朋友一起看看吧
    2021-10-10
  • 最流行的java后台框架spring quartz定时任务

    最流行的java后台框架spring quartz定时任务

    近日项目开发中需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信息,借此机会整理了一下定时任务的几种实现方式,由于项目采用spring框架,所以我都将结合spring框架来介绍
    2015-12-12
  • Java面试题篇之Sleep()方法与Wait()方法的区别详解

    Java面试题篇之Sleep()方法与Wait()方法的区别详解

    这篇文章主要给大家介绍了关于Java面试题篇之Sleep()方法与Wait()方法区别的相关资料,wait()是Object类中的方法,而sleep()是Thread类中的静态方法,wait()方法用于多个线程之间的协作和通信,而sleep()方法用于线程的休眠,需要的朋友可以参考下
    2024-07-07

最新评论