扫码阅读
手机扫码阅读

说一下线程池的核心参数,线程池的执行原理知道嘛

109 2024-07-17

我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。

查看原文:说一下线程池的核心参数,线程池的执行原理知道嘛
文章来源:
springboot葵花宝典
扫码关注公众号
线程池核心参数与执行原理摘要

线程池的核心参数

线程池的七大核心参数包括:

  • corePoolSize: 核心线程数目。
  • maximumPoolSize: 最大线程数目,包括核心线程和救急线程。
  • keepAliveTime: 救急线程的最大存活时间,无任务则线程被回收。
  • unit: 时间单位,例如秒或毫秒。
  • workQueue: 当核心线程忙时,新任务进入队列等待。
  • threadFactory: 线程工厂,自定义线程创建细节。
  • handler: 拒绝策略,当线程繁忙且队列满时的处理策略。

线程池的执行原理

线程池在执行任务时:

  1. 先检查核心线程是否已满,未满则直接执行。
  2. 核心线程满,则检查阻塞队列是否已满,未满则加入队列。
  3. 阻塞队列满,检查线程数是否小于最大线程数,是则创建临时线程执行。
  4. 所有线程忙碌时,执行拒绝策略。

线程池的拒绝策略

拒绝策略包括:

  • AbortPolicy: 默认策略,抛出异常。
  • CallerRunsPolicy: 调用者线程自己执行任务。
  • DiscardOldestPolicy: 丢弃队列最前的任务,执行新任务。
  • DiscardPolicy: 直接丢弃任务。

常见阻塞队列

常用阻塞队列如下:

  • ArrayBlockingQueue: 基于数组的有界队列。
  • LinkedBlockingQueue: 基于链表的有界/无界队列。
  • DelayedWorkQueue: 优先级队列,按执行时间排序。
  • SynchronousQueue: 不存储元素的队列,插入操作需等待移除操作。

ArrayBlockingQueue与LinkedBlockingQueue的区别

特点 LinkedBlockingQueue ArrayBlockingQueue
边界 默认无界,支持有界 强制有界
底层结构 链表 数组
初始化 懒惰,创建时添加数据 提前初始化
加锁方式 两把锁(读写分离) 单锁(读写共用)

线程池的种类

java.util.concurrent.Executors类提供四种常见线程池:

  1. 固定线程数的线程池,使用LinkedBlockingQueue
  2. ...

适合于已知任务量且任务耗时的场景。

摘要: 本文介绍了线程池的核心参数、执行原理、拒绝策略以及常见阻塞队列。线程池的核心参数包括核心线程数、最大线程数、救急线程存活时间、时间单位、工作队列、线程工厂和拒绝策略。执行原理涉及核心线程和工作队列的检查以及救急线程的创建。拒绝策略有四种,包括抛出异常、调用者执行任务、丢弃最旧任务和直接丢弃任务。常用的阻塞队列有ArrayBlockingQueue和LinkedBlockingQueue等。ArrayBlockingQueue是有界队列,基于数组,初始化时创建所有节点,使用单一锁。LinkedBlockingQueue可无界也可有界,基于链表,新增数据时创建节点,使用两把锁。最后,介绍了java.util.concurrent.Executors类提供的四种线程池,其中固定线程数的线程池使用LinkedBlockingQueue,适用于任务量已知且耗时的任务。

想要了解更多内容?

查看原文:说一下线程池的核心参数,线程池的执行原理知道嘛
文章来源:
springboot葵花宝典
扫码关注公众号