线程池
- 1. 概念
- 2. 工作流程
- 3. ThreadPoolExecutor参数
1. 概念
线程池是一种利用池化技术思想来实现的线程管理技术,主要是为了复用线程、便利地管理线程和任务、并将线程的创建和任务的执行解耦开来。我们可以创建线程池来复用已经创建的线程来降低频繁创建和销毁线程所带来的资源消耗。在JAVA中主要是使用ThreadPoolExecutor类来创建线程池,并且JDK中也提供了Executors工厂类来创建线程池(不推荐使用)。
线程池的优点:
- 降低资源消耗: 复用已创建的线程来降低创建和销毁线程的消耗。
- 提高响应速度: 任务到达时,可以不需要等待线程的创建立即执行。
- 提高线程的可管理性: 使用线程池能够统一的分配、调优和监控。
线程池的继承体系:
2. 工作流程
- 如果workerCount < corePoolSize ==> 创建线程执行提交的任务
- 如果workerCount >= corePoolSize && 阻塞队列未满 ==> 添加至阻塞队列,等待后续线程来执行提交地任务
- 如果workerCount >= corePoolSize && workerCount <maxinumPoolSize && 阻塞队列已满 ==> 创建非核心线程执行提交的任务
- 如果workerCount >= maxinumPoolSize && 阻塞队列已满 ==> 执行拒绝策略
3. ThreadPoolExecutor参数
- corePoolSize: 线程池核心线程大小
- maximumPoolSize: 线程池最大线程数量
- keepAliveTime: 空闲线程存活时间
- unit: 空闲线程存活时间单位
- workQueue: 工作队列
- threadFactory: 线程工厂
- handler: 拒绝策略
四个拒绝策略:
- CallerRunsPolicy: 直接拒绝
- AbortPolicy: 抛出异常
- DiscardPolicy: 什么都不做
- DiscardOldestPolicy: 抛弃进入队列最早的那个任务