面向就业的学习历程day2--线程池

线程池学习笔记

    • 1.线程池是什么
      • 1.1解决的问题
      • 1.2如何解决
    • 2.核心参数
    • 3.工作流程
    • 4.拒绝策略

1.线程池是什么

线程池解决的核心问题就是资源管理问题

1.1解决的问题

在并发条件下,系统不能够确定在任意时刻中,有多少任务需要执行,有多少资源需要投入。这种不确定性将带来以下若干问题:

  1. 频繁申请/销毁资源和调度资源,将带来额外的消耗
  2. 对资源无限申请缺少抑制手段,易引发系统资源耗尽的风险
  3. 系统无法合理管理内部的资源分布,会降低系统的稳定性

1.2如何解决

池化(Pooling)
面向就业的学习历程day2--线程池_第1张图片

线程池在内部实际上构建了一个生产者消费者模型,将线程和任务两者解耦,并不直接关联,从而良好的缓冲任务,复用线程。
线程池的运行主要分成两部分:任务管理、线程管理
任务管理部分充当生产者的角色,当任务提交后,线程池会判断该任务后续的流转:

  1. 直接申请线程执行该任务;
  2. 缓冲到队列中等待线程执行;
  3. 拒绝该任务。

线程管理部分是消费者,它们被统一维护在线程池内,根据任务请求进行线程的分配,当线程执行完任务后则会继续获取新的任务去执行,最终当线程获取不到任务的时候,线程就会被回收

2.核心参数

构造器

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
    this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
         Executors.defaultThreadFactory(), defaultHandler);
}

corePoolSize(核心线程数量):向线程池提交一个任务,此时,若线程池已创建的线程数小于corePoolSize,即便此时存在空闲线程,也会通过创建一个新线程来执行该任务,直到已创建的线程数大于或等于corePoolSize

maximumPoolSize(最大线程数量):线程池所允许的最大同时可执行线程数量。当队列满了,且已创建的线程数小于maximumPoolSize,则线程池会创建新的线程来执行任务

keepAliveTime(线程存活保持时间):当线程池中线程数大于核心线程数时,线程的空闲时间如果超过线程存活时间,那么这个线程就会被销毁,直到线程池中的线程数小于等于核心线程数

workQueue(任务队列):用于传输和保存等待执行任务的阻塞队列

handler(线程饱和策略):拒绝策略

3.工作流程

任务调度是线程池的主要入口,当用户提交了一个任务,接下来这个任务将如何执行都是由这个阶段决定的

执行过程如下:

  1. 首先检测线程池运行状态1,如果不是RUNNING,则直接拒绝,县城吹要保证在RUNNING的状态下执行任务
  2. 如果workerCount < corePoolSize,则创建并启动一个线程来执行新提交的任务
  3. 如果workerCount >= corePoolSize,且线程池内的阻塞队列未满,则将任务添加到该阻塞队列中
  4. 如果workerCount < maximumPoolSize,且线程池内的阻塞队列已满,则创建并启动一个线程来执行新提交的任务
  5. 如果workerCount >= maximumPoolSize,并且线程池内的阻塞队列已满,则根据拒绝策略来处理该任务,默认的处理方式是直接抛异常
    面向就业的学习历程day2--线程池_第2张图片

4.拒绝策略

任务拒绝模块是线程池的保护部分,上述的1和5会采用拒绝策略,保护线程池。有四种拒绝策略

  1. ThreadPoolExecutor.AbortPolicy
    线程池的默认拒绝策略为Abort Policy,即丢弃任务并抛出RejectedExecutionException异常
  2. DiscardPolicy
    丢弃任务,但是不抛出异常。如果线程队列已满,则后续提交的任务都会被丢弃,且是静默丢弃
  3. DiscardOldestPolicy
    丢弃队列最前面的任务,然后重新提交被拒绝的任务
  4. CallersRunsPolicy
    由调用线程处理该任务

参考文章:
Java线程池实现原理.
线程池主要参数及作用.


  1. 五个状态:running、shutdown、stop、tidying、terminated ↩︎

你可能感兴趣的:(java,开发语言,后端)