线程池作用
- 降低资源消耗,通过重复利用已创建的线程,降低线程创建和销毁造成的资源消耗。
- 提高线程的可管理性。线程是稀缺资源,如果无限的创建,不仅会消耗系统的资源,还会降低系统的稳定性,使用线程池可以统一的分配,调优和监控。
创建线程池
Executors创建
- newCachedThreadPool
- newFixedThreadPool
- newScheduledThreadPool
- newSingleThreadExecutor
使用ThreadPoolExecutor创建
阿里开发手册推荐方式,可以更好的理解线程池的主要组成,更能根据业务配置合适的线程池。
线程池的主要组成
- corePoolSize: 核心线程数,线程池工作的线程数量,未达到数量时,无论是否有空闲线程,都去创建一个线程。
- maximumPoolSize: 最大线程数,线程池润许创建的最大线程数量。
- keepAliveTime: 线程最大空闲时间,当线程空闲达到指定时间后,回收线程。
- unit: 空闲时间单位。
- workQueue: 工作队列,等待的任务存放的队列。
- threadFactory: 线程工厂,可以自定义实现创建线程的规则。
- handler: 拒绝策略,当线程池无法执行任务时,怎么去处理该任务。
- DiscardPolicy: 不进行处理。
- DiscardOldestPolicy: 把队列中最早的删除,执行当前任务。
- AbortPolicy: 抛出异常。
- CallerRunsPolicy: 主线程处理。
- 自定义:实现RejectedExecutionHandler接口即可。
public class MyRunsPolicy implements RejectedExecutionHandler { public MyRunsPolicy () { } public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { // 此处按照自己的业务处理即可 } }
线程池的工作流程
线程池如何复用线程
这也是我好奇的原因,像其他组件,就算不需要看代码,也能大致想到怎样实现的,但是线程池我一直认为很复杂,没想出来,所以打开源代码查看,结果大吃一惊,只是在线程中直接调用线程的run方法。。。我giao!!