线程池-submit 与 execute

submit 与 execute


一、前言

本章节介绍线程池下 submit 与 execute 的区别


二、核心区别

  1. submit() 会抛出异常,execute() 不会抛出异常;如果抛出异常会导致线程终止, 线程终止后线程池如果需要创建线程,会创建一个新的线程
  2. submit() 可以传入 Runnable 和 Callable, execute() 只能传入 Runnable

三、代码示例

3.1 execute() 抛出异常新创建线程示例

java 复制代码
ThreadPoolExecutor executor = new ThreadPoolExecutor(
					// 核心线程 2
           2,
           // 最大线程 2
           2,
           // 过期时间 1 小时
           1,
           TimeUnit.HOURS,
           // 阻塞队列 10
           new ArrayBlockingQueue<>(10),
           // 线程工厂, 自定义了线程名字, 方便观察效果
           new ThreadFactory() {

               private static final AtomicInteger number = new AtomicInteger(1);

               @Override
               public Thread newThread(Runnable r) {
                   return new Thread(r, "custom-" + number.getAndIncrement());
               }
           },
           // 拒绝策略
           new ThreadPoolExecutor.DiscardOldestPolicy());
    // 提交 10 个任务, 当 thread 最后是 2 的时候抛出异常
    // 也就是观察一下当 custom-2 打印错误之后是否还有 2 在执行任务
   for (int i = 1; i <= 10; i++) {
       executor.execute(() -> {
           String threadName = Thread.currentThread().getName();
           if (threadName.endsWith("2")) {
               throw new RuntimeException("线程信息错误" + threadName);
           }
           System.out.println("haha" + threadName);
       });
   }

   ThreadUtil.waiting();

3.2 execute() 与 submit() 一览

java 复制代码
// 运行这个 Runnable, 无返回值
void execute(Runnable command);
// 提交一个 Callable, 通过 Future 获取结果
Future<T> submit(Callable<T> task)
// 提交一个 Runnable, 任务结果后返回 result 通过 Future 获取
Future<T> submit(Runnable task, T result)
// 提交一个 Runnable, 虽然 Future 泛型是个 ?, 但是返回的是一个 Void
Future<?> submit(Runnable task);
相关推荐
学计算机的计算基5 分钟前
操作系统内存管理全解:虚拟内存、页表、COW、malloc、OOM一篇搞定
java·笔记·算法
tachibana210 分钟前
hot100 前 K 个高频元素(347)
java·数据结构·算法·leetcode
万亿少女的梦16829 分钟前
基于Spring Boot、Java与MySQL的网络订餐系统设计与实现
java·spring boot·mysql·系统设计·网络订餐
咩咩啃树皮9 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
鱟鲥鳚9 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
大模型码小白11 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司12 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地12 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
wuqingshun31415913 小时前
TCP超时重传机制是为了解决什么问题?
java
莫逸风15 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope