Java多线程——线程池

核心组成
  1. corePoolSize:指定了线程池中的线程数量。

  2. maximumPoolSize:指定了线程池中的最大线程数量。

  3. keepAliveTime:当前线程池数量超过 corePoolSize 时,多余的空闲线程的存活时间,即多次时间内会被销毁。

  4. unit:keepAliveTime 的单位。

  5. workQueue:任务队列,被提交但尚未被执行的任务。

  6. threadFactory:线程工厂,用于创建线程,一般用默认的即可。

  7. handler:拒绝策略,当任务太多来不及处理,如何拒绝任务。

运作机制
  1. 判断线程数是否大于核心线程数,如果不是,创建线程执行任务
  2. 判断队列是否已满,如果不是,任务进入队列等待
  3. 判断线程数是否大于最大线程数,如果不是,创建线程执行任务
  4. 执行拒绝策略
拒绝策略
策略名称 含义
AbortPolicy(默认) 直接抛出异常,阻止系统正常运行
DiscardPolicy 该策略默默地丢弃无法处理的任务,不予任何处理
DiscardOldestPolicy 丢弃最老的一个请求,也就是即将被执行的一个任务,并尝试再次提交当前任务。
CallerRunsPolicy 只要线程池未关闭,该策略直接在调用者线程中,运行当前被丢弃的任务
队列

线程池主要用到的阻塞队列是前四个

名称 特点
ArrayBlockingQueue 用数组实现的有界阻塞队列。此队列按照先进先出(FIFO)的原则对元素进行排序。默认情况下
LinkedBlockingQueue 基于链表的阻塞队列,同 ArrayListBlockingQueue 类似,此队列按照先进先出(FIFO)的原则对元素进行排序
PriorityBlockingQueu 是一个支持优先级的无界队列。默认情况下元素采取自然顺序升序排列。可以自定义实现compareTo()方法来指定元素进行排序规则,或者初始化PriorityBlockingQueue 时,指定构造参数 Comparator 来对元素进行排序。需要注意的是不能保证同优先级元素的顺序。
DelayQueue 是一个支持延时获取元素的无界阻塞队列。队列使用 PriorityQueue 来实现
SynchronousQueue 是一个不存储元素的阻塞队列。每一个 put 操作必须等待一个 take 操作,否则不能继续添加元素。
LinkedTransferQueue 是 一 个 由 链 表 结 构 组 成 的 无 界 阻 塞 TransferQueue 队 列
LinkedBlockingDeque 是一个由链表结构组成的双向阻塞队列

设置线程参数

CPU密集型任务应当配置尽可能小的线程,如配置N(cpu)+1个线程的线程池

IO密集型的配置尽可能多的线程,如2*N(cpu)

猜你喜欢

转载自blog.csdn.net/lwl2014100338/article/details/107868183