“线程池中线程异常后:销毁还是复用?”

目录

一、验证execute提交线程池中

测试

结论

二、验证submit提交线程池中

测试

结论

三、源码解析

查看submit方法的执行逻辑

查看execute方法的执行逻辑

为什么submit方法,没有创建新的线程,而是继续复用原线程?

四、总结


需要说明,本文的线程池都是java.util.concurrent.ExecutorService线程池,本文将围绕验证,阅读源码俩方面来解析这个问题。

一、验证execute提交线程池中

测试

我们首先定义了一个 ThreadPoolExecutorDeadTest 类,用来演示 Java 中 ThreadPoolExecutor 的使用,以及在任务执行过程中发生异常时线程池的行为。然后,在代码中,通过创建一个线程池并提交多个任务来模拟线程池的运行情况,其中一个任务故意抛出异常。

测试代码如下:

public class ThreadPoolExecutorDeadTest {
  public static void main(String[] args) throws InterruptedException {
    ExecutorService executorService = buildThreadPoolExecutor();
    executorService.execute(() -> exeTask("execute"));
    executorService.execute(() -> exeTask("execute"));
    executorService.execute(() -> exeTask("execute-exception"));
    executorService.execute(() -> exeTask("execute"));
    executorService.execute(() -> exeTask("execute"));
    Thread.sleep(5000);
    System.out.println("再次执行任务=======================");
    executorService.execute(() -> exeTask("execute"));
    executorService.execute(() -> exeTask("execute"));
    executorService.execute(() -> exeTask("execute"));
    executorService.execute(() -> exeTask("execute"));
    executorService.execute(() -> exeTask("execute"));
  }

  public static ExecutorService buildThreadPoolExecutor() {
    return new ThreadPoolExecutor(5, 10, 30, TimeUnit.SECONDS,
      new LinkedBlockingQueue<>(1000), new ThreadFactoryBuilder().setNameFormat("test-%s").build()
      , new ThreadPoolExecutor.CallerRunsPolicy());
  }

  private static void exeTask(String name) {
    String printStr = "[thread-name:" + Thread.currentThread().getName() + ",执行方式:" + name + "]";
    if ("execute-exce
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值