并发编程艺术-9

本文主要介绍了java 中的线程池。

  1. 线程池的好处:
    (1)降低资源的消耗:利用已创建的线程降低创建和销毁的消耗
    (2)提高响应时间,建立在(1) 的基础上
    (3)提高线程的可管理性

  2. 线程池工作流程 :
    提交一个新的任务之后
    (1) 判断核心线程池里面是否都在执行任务,一种情况是线程池刚启动,里面的核心线程还没有达到预设的数量,则创建核心线程池,并把任务提交给核心线程执行,还有一种情况是,核心线程池里面有核心线程当前处于闲置状态,则提交任务给其运行,上述两种情况都不满足的情况下,则核心线程池已满,处于运行状态。进入下一步判断

(2)判断队列是否已满,如果没满,则任务进入工作队列,否则进入下一步。

(3) 判断线程池是否都已经处于工作状态,如果都是,则交给饱和策略,否则创建新线程执行任务。


  1. 执行示意图 :

4.线程池关键点介绍
阻塞队列部分介绍:
(1) BlockingQueue:

ArrayBlockingQueue: 基于数组,先进先出排序。

LinkedBlockingQueue:基于队列。

SynchronizedQueue:不存储元素的阻塞队列,每一个插入操作必须等待另外一个线程移除操作,否者插入操作一直处于阻塞状态。

PriorityBlockingQueue:具有优先级。

(2) RejectExecutionHandler :

AbortPolicy: 直接跑出异常

DiscardPolicy:不处理丢掉

CallerRunsPolicy:只用调用者所在的线程来运行任务。

DiscardOldestPolicy: 丢弃队列中最近的一个任务,并执行当前任务。

(3) 提交方式:

submit() : 提交有返回值的任务
excute() : 提交没有返回值得任务

(4) 关闭线程池:

shutdown(): 将状态设置成shutdown 状态,中断所有没有正在执行任务的线程。

shutdownNow():将状态设置成STOP状态,并且尝试停止所有的线程,并返回等待执行任务的列表。

(5)如何合理分配线程池线程数量:

N 代表CPU
IO密集型:线程数为 N * 2

CPU 密集型:N+1

混合型:尽可能地拆分乘CPU密集型和IO密集型。

有时候还需要关注 任务的优先级以及 是否依赖于其他的系统资源。

(6) 线程池监控。

taskCount: 线程池中运行任务的数量。

completedTaskCount : 运行过程中已完成的任务数量。
等等。

推荐阅读更多精彩内容