当前位置:网站首页>【多线程】线程池核心类-ThreadPoolExecutor
【多线程】线程池核心类-ThreadPoolExecutor
2022-06-13 05:01:00 【阿小冰】
前言
ThreadPoolExecutor有很多构造函数,我们就摘要一个参数最多的那个方法来讲解
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
参数讲解
1、首先我们介绍一下corePoolSize、maximumPoolSize、workQueue这是三个入参
- corePoolSize:核心线程数量
- maximumPoolSize:最大线程数
- workQueue:阻塞队列,存储等待执行的任务,这个参数很重要,后面我们再讲
这三者关系:
- 如果运行的线程小于corePoolSize,就会直接创建新线程处理任务,即使线程池中的其他线程都是空闲的
- 如果运行的线程大于等于corePoolSize,并且小于maximumPoolSize,那这个时候,只要workQueue满了的时候,才会创建新的线程来处理任务
- 如果设置的corePoolSize=maximumPoolSize,那线程池的大小就是固定的,如果这个时候,有新任务提交并且workQueue没有满的话,就会把请求放在workQueue中,等待空闲的线程,然后从workQueue中取出任务进行处理
- 如果运行的线程数量大于maximumPoolSize,同时workQueue已经满了,就会通过拒绝策略参数handler来制定处理策略
1.1、这三个参数对任务进行如下的处理方式:
当提交一个新的任务到线程池中的时候,线程池会根据当前线程池中正在运行的线程数量来决定该任务的处理方式,处理方式主要是:直接切换、使用无限队列、使用有界队列
- 直接切换:常用的队列是SynchronousQueue
- 使用无限队列就是使用基于链表的队列,比如LinkedBlockingQueue,在这种方式下,线程池中的最大线程数就是corePoolSize,此时maximumPoolSize就没有作用了,当线程池中的所有线程都运行并提交任务了,就会放入等待队列中
- 使用有界队列是ArrayBlockingQueue,在这个方式下,可以将线程池的最大线程数量限制为maximumPoolSize,这样可以达到低消耗,的那是这种方式有一定的困难,就是线程池对线程的调度会很困难,所以线程池和队列的容量都是有限的了
1.2、通过这三个参数,来降低系统资源消耗:
- 如果想低耗,可以设置一个较大的队列容量和较小的线城市容量,这样的话会降低线程处理任务的吞吐量
- 如果提交的任务经常阻塞,可以条用设置最大线程数的方法,重新设置线程池最大线程数
- 如果队列的容量较小,一般情况下就需要把线程池的容量设置的大一点,这样的话,CPU的使用率就会高一些
- 如果线程池的容量比较大,并发量就会增加,就需要考虑线程调度的问题,反而可能会降低处理任务的吞吐量
2、其他入参:keepAliveTime、unit、threadFactory、handler
- keepAliveTime:线程没有任务执行时最多保持多久时间才终止,当线程池中的线程数量大于corePoolSize的时候,没有新的任务提交,那核心线程外的线程不会立马销毁, 而是等待一段时间,如果时间超过了keepAliveTime设置的时间,就会自动销毁
- unit:keepAliveTime的时间单位
- threadFactory:线程工厂,用来创建线程 默认会提供一个默认的工厂来创建线程,当使用默认的工厂来创建线程时,会使新创建的线程具有相同的优先级,并且是非守护的 线程,同时也设置了线程的名称
- handler:拒绝处理任务时的策略,如果workQueue阻塞队列满了,并且没有空闲的线程池,此时,继续提交任务,需要采取一种策略来处理这个任务。
3、handler提供的四种策略
- AbortPolicy:直接抛出异常,默认配置
- CallerRunsPolicy:用调用者所在的线程来执行任务
- DiscardOldestPolicy:丢弃队列中最靠前的任务并执行当前任务
- DiscardPolicy:直接丢弃当前任务
提供的启动和停止任务的方法
- execute():提交任务,交给线程池执行
- submit():提交任务,能够返回执行结果 execute+Future
- shutdown():关闭线程池,等待任务都执行完
- shutdownNow():立即关闭线程池,不等待任务执行完
提供的适用于监控的方法
- getTaskCount():线程池已执行和未执行的任务总数
- getCompletedTaskCount():已完成的任务数量
- getPoolSize():线程池当前的线程数量
- getCorePoolSize():线程池核心线程数
- getActiveCount():当前线程池中正在执行任务的线程数量
边栏推荐
- Solution to sudden font change in word document editing
- The games that you've tasted
- Hidden implementation and decoupling, knowing Pimpl mode
- How to handle async/await error messages gracefully
- Win8.1和Win10各自的优势
- Keil uses j-link to burn the code, and an error occurs: Flash download failed - one of the "Cortex-M3" solutions
- 语音信号分帧的理解
- PostgreSQL Guide: inside exploration (Chapter 10 basic backup and point in time recovery) - Notes
- Optocoupler working principle function electric parameter application circuit
- shell变量学习笔记
猜你喜欢
Section 3 - functions
Section 2 - branch and loop statements
Cesium:cesiumlab makes image slices and loads slices
无限循环滚动代码阿里巴巴国际站店铺装修代码底图滚动黑色半透明显示效果自定义内容装修代码全屏显示
metaRTC4.0稳定版发布
Avantages de win8.1 et win10
Sampo Lock
Bomb disposal cat
Section 7 - structures
The differences between the four startup modes of activity and the applicable scenarios and the setting methods of the two startup modes
随机推荐
Wang Dao Chapter II linear table exercises
QT interface rendering style
Analysis of the principle of V-model and its application in user defined components
All blog navigation
Avantages de win8.1 et win10
Simple-SR:Best-Buddy GANs for Highly Detailed Image Super-Resolution論文淺析
使用EasyDarwin+FFmpeg实现rtsp推流
Clause 47: please use traits classes to represent type information
自动评教脚本使用的配置
Autumn wind, dust, youth
Mysql8.0.13 installation tutorial (with pictures)
Introduction to QT XML
Section 2 - branch and loop statements
Article 49: understanding the behavior of new handler
Section 7 - structures
[JS solution] leedcode 200 Number of islands
BM1Z002FJ-EVK-001开机测评
Kaggle time series tutorial
Advanced C - Section 3 - character functions and string functions
lookup