当前位置:首页 > 科技  > 软件

Java线程池中线程异常后:是销毁还是复用

来源: 责编: 时间:2024-06-14 08:52:26 214观看
导读一个线程池中的线程异常了,那么线程池会怎么处理这个线程?需要说明,本文的线程池都是java.util.concurrent.ExecutorService线程池,本文将围绕验证,阅读源码俩方面来解析这个问题。代码验证验证execute提交线程池中测试代

EHU28资讯网——每日最新资讯28at.com

一个线程池中的线程异常了,那么线程池会怎么处理这个线程?EHU28资讯网——每日最新资讯28at.com

EHU28资讯网——每日最新资讯28at.com

EHU28资讯网——每日最新资讯28at.com

需要说明,本文的线程池都是java.util.concurrent.ExecutorService线程池,本文将围绕验证,阅读源码俩方面来解析这个问题。EHU28资讯网——每日最新资讯28at.com

EHU28资讯网——每日最新资讯28at.com

代码验证

验证execute提交线程池中

测试代码:EHU28资讯网——每日最新资讯28at.com

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-exception".equals(name)) {            throw new RuntimeException(printStr + ", 我抛异常了");        } else {            System.out.println(printStr);        }    }}

执行结果如下:EHU28资讯网——每日最新资讯28at.com

图片图片EHU28资讯网——每日最新资讯28at.com

结论:EHU28资讯网——每日最新资讯28at.com

execute 提交到线程池的方式,如果执行中抛出异常,并且没有在执行逻辑中catch,那么会抛出异常,并且移除抛出异常的线程,创建新的线程放入到线程池中。EHU28资讯网——每日最新资讯28at.com

验证submit提交线程池中

测试代码:EHU28资讯网——每日最新资讯28at.com

public class ThreadPoolExecutorDeadTest {    public static void main(String[] args) throws InterruptedException {        ExecutorService executorService = buildThreadPoolExecutor();        executorService.submit(() -> exeTask("execute"));        executorService.submit(() -> exeTask("execute"));        executorService.submit(() -> exeTask("execute-exception"));        executorService.submit(() -> exeTask("execute"));        executorService.submit(() -> exeTask("execute"));        Thread.sleep(5000);        System.out.println("再次执行任务=======================");        executorService.submit(() -> exeTask("execute"));        executorService.submit(() -> exeTask("execute"));        executorService.submit(() -> exeTask("execute"));        executorService.submit(() -> exeTask("execute"));        executorService.submit(() -> 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-exception".equals(name)) {            throw new RuntimeException(printStr + ", 我抛异常了");        } else {            System.out.println(printStr);        }    }}

执行结果如下:EHU28资讯网——每日最新资讯28at.com

图片图片EHU28资讯网——每日最新资讯28at.com

结论:EHU28资讯网——每日最新资讯28at.com

submit 提交到线程池的方式,如果执行中抛出异常,并且没有catch,不会抛出异常,不会创建新的线程。EHU28资讯网——每日最新资讯28at.com

源码解析

1.java.util.concurrent.AbstractExecutorService#submit(java.lang.Runnable);EHU28资讯网——每日最新资讯28at.com

图片图片EHU28资讯网——每日最新资讯28at.com

2. 查看execute方法的执行逻辑;EHU28资讯网——每日最新资讯28at.com

EHU28资讯网——每日最新资讯28at.com

图片图片EHU28资讯网——每日最新资讯28at.com

3. java.util.concurrent.ThreadPoolExecutor#processWorkerExit;EHU28资讯网——每日最新资讯28at.com

图片图片EHU28资讯网——每日最新资讯28at.com

可以发现,如果抛出异常,会移除抛出异常的线程,创建新的线程。EHU28资讯网——每日最新资讯28at.com

4. 为什么submit方法,没有创建新的线程,而是继续复用原线程;EHU28资讯网——每日最新资讯28at.com

还记得,我们在3.1的时候,发现submit也是调用了execute方法,但是在调用之前,包装了一层 RunnableFuture,那一定是在RunnableFuture的实现 FutureTask中有特殊处理了,我们查看源码可以发现。EHU28资讯网——每日最新资讯28at.com

图片图片EHU28资讯网——每日最新资讯28at.com

图片图片EHU28资讯网——每日最新资讯28at.com

图片图片EHU28资讯网——每日最新资讯28at.com

图片图片EHU28资讯网——每日最新资讯28at.com

但是,我们通过java.util.concurrent.FutureTask#get()就可以获取对应的异常信息。EHU28资讯网——每日最新资讯28at.com

EHU28资讯网——每日最新资讯28at.com

总结

当一个线程池里面的线程异常后:EHU28资讯网——每日最新资讯28at.com

  • 当执行方式是execute时,可以看到堆栈异常的输出,线程池会把这个线程移除掉,并创建一个新的线程放到线程池中。
  • 当执行方式是submit时,堆栈异常没有输出。但是调用Future.get()方法时,可以捕获到异常,不会把这个线程移除掉,也不会创建新的线程放入到线程池中。

以上俩种执行方式,都不会影响线程池里面其他线程的正常执行。EHU28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-93697-0.htmlJava线程池中线程异常后:是销毁还是复用

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 大厂面试必备:如何轻松实现分布式Session管理?

下一篇: Go必知必会:数组和切片详解

标签:
  • 热门焦点
  • 影音体验是真的强 简单聊聊iQOO Pad

    大公司的好处就是产品线丰富,非常细分化的东西也能给你做出来,例如早先我们看到了新的vivo Pad2,之后我们又在iQOO Neo8 Pro的发布会上看到了iQOO的首款平板产品iQOO Pad。虽
  • 三言两语说透设计模式的艺术-简单工厂模式

    一、写在前面工厂模式是最常见的一种创建型设计模式,通常说的工厂模式指的是工厂方法模式,是使用频率最高的工厂模式。简单工厂模式又称为静态工厂方法模式,不属于GoF 23种设计
  • 分布式系统中的CAP理论,面试必问,你理解了嘛?

    对于刚刚接触分布式系统的小伙伴们来说,一提起分布式系统,就感觉高大上,深不可测。而且看了很多书和视频还是一脸懵逼。这篇文章主要使用大白话的方式,带你理解一下分布式系统
  • 三万字盘点 Spring 九大核心基础功能

    大家好,我是三友~~今天来跟大家聊一聊Spring的9大核心基础功能。话不多说,先上目录:图片友情提示,本文过长,建议收藏,嘿嘿嘿!一、资源管理资源管理是Spring的一个核心的基础功能,不
  • 从零到英雄:高并发与性能优化的神奇之旅

    作者 | 波哥审校 | 重楼作为公司的架构师或者程序员,你是否曾经为公司的系统在面对高并发和性能瓶颈时感到手足无措或者焦头烂额呢?笔者在出道那会为此是吃尽了苦头的,不过也得
  • 一个注解实现接口幂等,这样才优雅!

    场景码猿慢病云管理系统中其实高并发的场景不是很多,没有必要每个接口都去考虑并发高的场景,比如添加住院患者的这个接口,具体的业务代码就不贴了,业务伪代码如下:图片上述代码有
  • 年轻人的“职场羞耻感”,无处不在

    作者:冯晓亭 陶 淘 李 欣 张 琳 马舒叶来源:燃次元&ldquo;人在职场,应该选择什么样的着装?&rdquo;近日,在网络上,一个与着装相关的帖子引发关注,在该帖子里,一位在高级写字楼亚洲金
  • 支持aptX Lossless无损传输 iQOO TWS 1赛道版发布限时优惠价369元

    2023年7月4日,“无损音质,声动人心”iQOO TWS 1正式发布,支持aptX Lossless无损传输,限时优惠价369元。iQOO TWS 1耳机率先支持端到端aptX Lossless无
  • 利用职权私自解除被封帐号 Meta开除20多名员工

    11月18日消息,据外媒援引知情人士表示,过去一年时间内,Facebook母公司Meta解雇或处罚了20多名员工以及合同工,指控这些人通过内部系统以不当方式重置用户帐号,其
Top