线程池的主要处理流程及常用方法

news/2024/7/2 23:14:31

线程池的主要处理流程及常用方法

更多优秀文章,请扫码关注个人微信公众号或搜索“程序猿小杨”添加。

一、主要处理流程:

当调用线程池execute() 方法添加一个任务时,

threadPoolExecutor.execute,具体代码如下:

private void batchOpSpilit(List<Student> list, int batch100) {        log.info("开始切割………………");        List<List<Student>> list1 = SplitListUtils.pagingList(list, batch100);        try {            for (List<Student> list2 : list1) {//                threadPoolExecutor.allowCoreThreadTimeOut(true);                //再调batchOp方法,这里的多线程是多个小集合往数据库插入                threadPoolExecutor.execute(() -> {                    log.info("我是线程开始保存数据...:" + Thread.currentThread().getName());                    batchOp(list2);                });            }            log.info("当前线程池剩余的数量222222:"+threadPoolExecutor.getPoolSize());        } catch (Exception e) {            log.info("出现异常:"+e);        } finally {            //最后关闭线程 不允许提交新的任务,但是会处理完已提交的任务            threadPoolExecutor.shutdown();        }    }

线程池会做如下判断:

    1、若核心线程池(corePoolSize)未满,创建核心线程执行任务;

    2、若核心线程池(corePoolSize)已经满,且队列(workQueue)未满,则任务添加到队列中等待执行,而不添加新的线程。

   3、若队列(workQueue)已经满,同时池中的线程数小于maximumPoolSize ,则创建新的线程执行任务;

    4、若核心线程池(corePoolSize)已经满,且阻塞队列(workQueue)已满,同时池中的线程数等于maximumPoolSize ,则根据构造函数中的 handler 指定的策略来拒绝新的任务。

二、案例说明:

    如果有一个corePoolSize为5,maximumPoolSize为10的线程池,可用下图形象展示:

  /**线程池*/    private ThreadPoolExecutor threadPoolExecutor =            new ThreadPoolExecutor(                    5, //corePoolSize:线程池中核心线程数                    10,  //线程池中能拥有最多线程数                    5L,  //keepAliveTime:表示空闲线程的存活时间 2秒                    TimeUnit.SECONDS, //表示keepAliveTime的单位:秒                    new LinkedBlockingQueue<>(100),  //用于缓存任务的阻塞队列                    Executors.defaultThreadFactory(),                    new ThreadPoolExecutor.CallerRunsPolicy()            );

    备注:所谓核心线程,非核心线程只是一个数量的说明,并不是说两者有本质上的不同,都是普通的线程而已,且线程特性都一样,并不是说核心线程有特殊标记,线程池能“认”出来这是核心线程,对其有特殊操作。

三、线程池的状态:

四、常用方法:

更多优秀文章,请扫码关注个人微信公众号或搜索“程序猿小杨”添加。

   1、SpringBoot使用@Async实现多线程异步;

    2、线程池的主要处理流程及常用方法

    3、为什么推荐使用线程池?


http://lihuaxi.xjx100.cn/news/1241535.html

相关文章

CVPR 2023 | 基于金字塔模型的异常检测方法

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 论文链接&#xff1a;https://arxiv.org/pdf/2211.11317 0.背景&#xff1a; 工业异常检测旨在发现产品的异常区域&#xff0c;在工业质量检测中发挥着重要作用。在工业场景中&#xff0c;很容易获得大量的正…

力扣 1483. 树节点的第 K 个祖先

力扣 1483. 树节点的第 K 个祖先 题目地址&#xff1a;https://leetcode.cn/problems/kth-ancestor-of-a-tree-node/ 暴力查找&#xff08;超时&#xff09;哈希查找&#xff08;超空间&#xff09;树上倍增 预处理 ancestor 数组记录了第 i 个 node 的倍增祖先&#xff0c…

Linux系统实现虚拟内存教程

Linux系统实现虚拟内存有两种方法&#xff1a;交换分区&#xff08;swap分区&#xff09;和交换文件&#xff0c; 一、交换文件 查看内存&#xff1a;free -m , -m是显示单位为MB&#xff0c;-g单位GB free -g 创建一个文件&#xff1a;touch命令用于修改…

Redis6之数据类型

常见数据类型 String字符串 简介 String是最基本的数据类型&#xff0c;是二进制安全的&#xff0c;一个key对应一个value 常用命令 1.set <key> <value> :添加键值对 2.get <key>&#xff1a;查询对应键值对 3.append <key> <value>&#xf…

微信小程序开发大坑盘点

微信小程序开发大坑盘点 起因 前几天心血来潮&#xff0c;想给学校设计个一站式校园小程序&#xff0c;可以查询成绩&#xff0c;考试信息&#xff0c;课表之类的&#xff08;本来想法里是还想包括一些社交功能的&#xff0c;但这个因为资质问题暂且搁置了&#xff09;。其实…

pandas---数据合并(concat、append、merge)

1. concat函数 pd.concat([data1, data2], axis1) 按照行或列进行合并&#xff0c;axis0为列索引&#xff0c;axis1为行索引。 df1 make_df([1, 2], [A, B]) df2 make_df([3, 4], [A, B]) display(df1, df2) # 默认上下合并&#xff0c;垂直合并 pd.concat([df1, df2]) …

RabbitMq消息堆积问题及惰性队列

消息堆积问题 当生产者发送消息的速度超过了消费者处理的速度&#xff0c;就会导致队列的消息堆积&#xff0c;知道队列存储消息达到上限。最早接受的消息&#xff0c;可能就会成为死信&#xff0c;会被丢弃&#xff0c;这就是消息堆积问题。 解决消费对接问题 1.增加更多的消…

希尔贝壳邀您参加2023深圳国际人工智能展览会

2023深圳国际人工智能展览会“AIE”将于2023年5月16-18日在深圳国际会展中心 (宝安)举办&#xff0c;希尔贝壳受邀参加&#xff0c;展位号&#xff1a;A331。 伴随着智能行业的快速发展&#xff0c;展会已被越来越多的企业列入每年必选展会&#xff0c;也成为各采购商选购的理…