java 线程池 ThreadPoolExecutor

线程池通过管理线程资源防止内存溢出,合理利用CPU。核心属性包括corePoolSize、allowCoreThreadTimeOut、keepAliveTime和maximumPoolSize。线程池有RUNNING、SHUTDOWN、STOP和TERMINATED四种状态,可通过shutdown()和shutdownNow()进行状态转换。获取任务流程涉及线程池的调度策略。默认线程池如newCachedThreadPool、newSingleThreadExecutor和newFixedThreadPool各有其特定用途。
摘要由CSDN通过智能技术生成
一、线程池解决的问题
  • 线程对象的重复利用
  • 防止内存溢出风险,线程池中线程数、任务数可以是有限的。
  • 合理的利用cpu,避免过多线程造成cpu超负荷运转
二、核心属性
  • corePoolSize:线程在没有任务时,需要维持的线程数。在没有任务时维持一定量的线程,可以减少在来任务时,创建线程的时间。
  • allowCoreThreadTimeOut:是否允许核心线程在指定的超时时间内,获取不到结束时结束。如果为true,在没有任务时,线程不在维持corePoolSize指定的线程数,而是逐渐递减直至为0
  • keepAliveTime:获取任务的超时时间,有以下两种情况会超时获取任务,其他情况会一直阻塞获取任务
    • 超过了核心线程数,且队列中有任务
    • 核心线程在allowCoreThreadTimeOut=true时
  • maximumPoolSize:最大线程数,超过最大线程数的线程,在获取任务阶段会直接退出,不会执行任务
  • workQueue:任务队列,默认长度整型最大值,可以限制长度,防止内存溢出
三、状态
  • RUNNING:初始状态
  • SHUTDOWN:不在接收新任务,可能还有工作线程在继续运行,直到队列中所有任务都运行完
  • STOP:不在接收新任务,所有任务线程在当前任务结束后停止,任务队列中没有运行的任务将被放弃
  • TERMINATED:线程池结束
shutdown()
shutdownNow()
RUNNING
SHUTDOWN
STOP
TERMINATED

上图为状态转换图,主要涉及两个方法。

  • shutdown():将线程池置为SHUTDOWN 状态,尝试(要获取线程锁)中断工作中的线程,禁止添加新的工作线程和任务 ,如果线程池中已没有工作线程且处于SHUTDOWN 或STOP 状态,则线程池进入TERMINATED状态。

  • shutdownNow():将线程池置为 STOP 状态,中断所有的工作线程,禁止添加新的工作线程和任务;如果线程池中已没有工作线程且处于SHUTDOWN 或STOP 状态,则线程池进入TERMINATED状态。

四、获取任务流程
获取状态
是否
SHUTDOWN
是否
STOP
返回Null
是否有任务
是否超过
最大线程数
允许核心
线程超时
或超过核心
线程数
是否上次
获取到任务
当前线程
是否超过1
是否有任务
允许核心
线程超时或
超过核心线程数
超时获取
任务
获取到任
务返回
阻塞获取
任务
五、默认线程池

java提供了几个默认配置的线程池,用于不同的场景

  1. Executors.newCachedThreadPool();

    • 核心线程数:0
    • 最大线程数:整型最大值
    • 最大任务数:0
    • 超时时间:60秒
    • 队列:SynchronousQueue队列(没有容量)
    • 特点:每添加一个任务,就会获取或新建一个线程,线程任务结束后会在60秒后结束线程
  2. Executors.newSingleThreadExecutor()

    • 核心线程数:1
    • 最大线程数:1
    • 最大任务数: 整型最大值
    • 超时时间:0秒
    • 队列:LinkedBlockingQueue
    • 特点:最多存在一个线程
  3. Executors.newFixedThreadExecutor(线程数 n)

    • 核心线程数:n
    • 最大线程数:n
    • 最大任务数: 整型最大值
    • 超时时间:0秒
    • 队列:LinkedBlockingQueue
    • 特点:最多存在n个线程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值