1、目的: 让某些对象被多次重复利用,减少频繁创建和销毁对象带来的开销问题
2、线程池: 内部创建好了若干线程,这些线程都是runnable,只需要从系统中取出任务就可以开始执行。优点:减少每次线程启动和销毁的损耗,提高时间和空间利用率。
ExecutorService接口
Executors类
【线程池的工具类】
// 1. 用来处理大量短时间工作任务的线程池,如果池中没有可用的线程将创建新的线程,如果线程空闲60秒将收回并移出缓存--数量动态变化的缓存池
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
// 2. 创建一个操作无界队列且固定大小线程池--固定大小线程池
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
// 3. 创建一个操作无界队列且只有一个工作线程的线程池--单线程池
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
// 4. 创建一个单线程执行器,可以在给定时间后执行或定期执行。
ScheduledExecutorService singleThreadScheduledExecutor = Executors.newSingleThreadScheduledExecutor();
// 5. 创建一个指定大小的线程池,可以在给定时间后执行或定期执行。--定期线程池
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);
// 6. 创建一个指定大小(不传入参数,为当前机器CPU核心数)的线程池,并行地处理任务,不保证处理顺序
Executors.newWorkStealingPool();
// 7. 自定义线程池,工作中使用这种方法创建线程池
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
3,//正式工
10,//临时工+正式工
10000,//等到1000还没有任务调度就销毁临时工
TimeUnit.MILLISECONDS,//单位 代表千分之一秒的时间单位
new LinkedBlockingQueue<Runnable>());//当线程数<任务数时,多余任务传入阻塞队列,
// 当前传入的队列为基于链表的阻塞队列,若没有传入大小则为无界阻塞队列
}
ThreadPoolExecutor类
1、构造方法
2、拒绝策略–当任务数量超过线程负荷
3、线程池的工作流程
①判断核心吃corePoolSize是否达到最大数量
1)未满,无论当前是否有空闲线程都要创建一个新线程执行任务,然后将此线程保存至核心池中
2)已满执行②
②判断工作队列是否已满
1)未满,将任务入队列,排队等调度
2)已满执行③
③判断当前线程数量是否达到maxiumSize
1)未满,创建新的线程处理此任务
2)已满执行④
④执行拒绝策略