线程池-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);
相关推荐
霸道流氓气质3 分钟前
AI 翻译插件:翻译记忆级联复用、术语混合检索与结构化质量门禁的 Vue3 + Spring AI 生产级实战
java·人工智能·spring
斯维赤9 分钟前
OCR到底是接入第三方API 还是自己封装?
java·ocr
码智社27 分钟前
Redis 哨兵模式详解:从原理到生产实践
java·redis
救救孩子把35 分钟前
结构化输出为何“格式正确、答案错误”?JSON Schema 的能力边界
android·java·json·agent·agent服务
silvamux_1 小时前
微头条爆款体平台适配实测:把交付要求变成可计算的指标
java·线性代数·算法·决策树·矩阵
论文复现现场1 小时前
DeepSeek V4.1 Flash 和 V4 Pro 有什么区别?API 价格、性能与迁移建议
java·服务器·人工智能·python·大模型api·deepseek·deepseek v4.1
郭小李1 小时前
转发与重定向
java·服务器·数据库
你看我名字1 小时前
数眼智能 Search + Reader 实战:联网问答怎样避免“搜到了,却引用错了”
android·java·开发语言
MetaLite2 小时前
Spring Boot 加了 @Valid,嵌套参数为什么还没校验?
java·spring boot·后端
半杯咖啡半行码2 小时前
QML与 Qt Quick入门实战:从零基础到 C++ 双向通信详解
java·qt·交互