循序渐进学习线程池 一 了解基本概念和参数意义,让你合理地配置线程池

什么是线程池?

  1. 降低资源的消耗

  2. 提高响应速度,任务:T1创建线程时间,T2任务执行时间,T3线程销毁时间,线程池没有或者减少T1和T3

  3. 提高线程的可管理性。

线程池要做些什么?

  1. 线程的容器和管理器

  2. 工作线程

  3. 任务接口

  4. 任务的容器

线程池的主要处理流程

1)线程池判断核心线程池里的线程是否都在执行任务。如果不是,则创建一个新的工作

线程来执行任务。如果核心线程池里的线程都在执行任务,则进入下个流程。

2)线程池判断工作队列是否已经满。如果工作队列没有满,则将新提交的任务存储在这

个工作队列里。如果工作队列满了,则进入下个流程。

3)线程池判断线程池的线程是否都处于工作状态。如果没有,则创建一个新的工作线程

来执行任务。如果已经满了,则交给饱和策略来处理这个任务。

ThreadPoolExecutor执行execute()方法的示意

1)如果当前运行的线程少于corePoolSize,则创建新线程来执行任务(注意,执行这一步骤

需要获取全局锁)。

2)如果运行的线程等于或多于corePoolSize,则将任务加入BlockingQueue。

3)如果无法将任务加入BlockingQueue(队列已满),则创建新的线程来处理任务(注意,执行这一步骤需要获取全局锁)。

4)如果创建新线程将使当前运行的线程超出maximumPoolSize,任务将被拒绝,并调用RejectedExecutionHandler.rejectedExecution()方法。

线程池的创建各个参数含义

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)

corePoolSize

线程池中的核心线程数,当提交一个任务时,线程池创建一个新线程执行任务,直到当前线程数等于corePoolSize;

如果当前线程数为corePoolSize,继续提交的任务被保存到阻塞队列中,等待被执行;

如果执行了线程池的prestartAllCoreThreads()方法,线程池会提前创建并启动所有核心线程。

maximumPoolSize

线程池中允许的最大线程数。如果当前阻塞队列满了,且继续提交任务,则创建新的线程执行任务,前提是当前线程数小于maximumPoolSize

keepAliveTime

线程空闲时的存活时间,即当线程没有任务执行时,继续存活的时间。默认情况下,该参数只在线程数大于corePoolSize时才有用

TimeUnit

keepAliveTime的时间单位

workQueue

workQueue必须是BlockingQueue阻塞队列。当线程池中的线程数超过它的corePoolSize的时候,线程会进入阻塞队列进行阻塞等待。通过workQueue,线程池实现了阻塞功能

threadFactory

创建线程的工厂,通过自定义的线程工厂可以给每个新建的线程设置一个具有识别度的线程名

Executors静态工厂里默认的threadFactory,线程的命名规则是“pool-数字-thread-数字”

RejectedExecutionHandler(饱和策略)

线程池的饱和策略,当阻塞队列满了,且没有空闲的工作线程,如果继续提交任务,必须采取一种策略处理该任务,线程池提供了4种策略:

(1)AbortPolicy:直接抛出异常,默认策略;

(2)CallerRunsPolicy:用调用者所在的线程来执行任务;

(3)DiscardOldestPolicy:丢弃阻塞队列中靠最前的任务,并执行当前任务;

(4)DiscardPolicy:直接丢弃任务;

当然也可以根据应用场景实现RejectedExecutionHandler接口,自定义饱和策略,如记录日志或持久化存储不能处理的任务。

关闭线程池

ShutDown():interrupt方法来终止线程

shutDownNow() 尝试停止所有正在执行的线程

合理地配置线程池

线程数配置:

任务:计算密集型,IO密集型,混合型

计算密集型=计算机的cpu数或计算机的cpu数+1(应付页缺失)

IO密集型=计算机的cpu数*2

混合型,拆分成计算密集型,IO密集型

Runtime.getRuntime().availableProcessors();当前机器中的cpu核心个数

尽量有界队列,不要使用无界队列,否则死了都还在喊冤

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
线程池是一种常见的多线程处理方式,它可以提高程序的并发性和效率。合理配置线程池参数可以更好地利用系统资源,提高程序的性能。以下是一些常见的线程池参数及其配置建议: 1. 核心线程数(corePoolSize):核心线程数是线程池中最基本的参数,它表示线程池中一直存活的线程数量。当线程池中的线程数小于核心线程数时,线程池会优先创建新线程处理任务。建议根据系统的负载情况和处理任务的类型来设置核心线程数,一般情况下可以设置为CPU核心数的2倍。 2. 最大线程数(maximumPoolSize):最大线程数是线程池中最多能够容纳的线程数量。当线程池中的线程数达到最大线程数时,新的任务将会被阻塞。建议根据系统的负载情况和处理任务的类型来设置最大线程数,一般情况下可以设置为CPU核心数的4倍。 3. 空闲线程存活时间(keepAliveTime):空闲线程存活时间是指当线程池中的线程数大于核心线程数时,空闲线程的存活时间。建议根据系统的负载情况和处理任务的类型来设置空闲线程存活时间,一般情况下可以设置为1分钟。 4. 队列容量(queueCapacity):队列容量是指线程池中任务队列的最大容量。建议根据系统的负载情况和处理任务的类型来设置队列容量,一般情况下可以设置为CPU核心数的10倍。 5. 拒绝策略(rejectedExecutionHandler):拒绝策略是指当线程池中的线程数达到最大线程数并且队列已满时,新的任务的处理方式。常见的拒绝策略有AbortPolicy、CallerRunsPolicy、DiscardOldestPolicy和DiscardPolicy。建议根据系统的负载情况和处理任务的类型来选择合适的拒绝策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值