3.1 线程池的引出
线程的频繁创建和销毁、使用量特别大的资源,例如并发情况下的资源,频繁的操作对性能影响很大。
||
提前创建一个线程池,放入多个线程,使用时直接调用,使用完成后放回线程池。
3.2 线程池的优势
1、降低资源消耗: 通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
2、提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行。
3、便于线程的统一管理:线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
3.3 线程池的创建
1、实例化实现类**ThreadPoolExector对象**,其中ThreadPoolExector类主要参数包括:
- **corePoolSize(必需)**:核心线程数。默认情况下,核心线程会一直存活,但是当将 allowCoreThreadTimeout 设置为 true 时,核心线程也会超时回收。
- **maximumPoolSize(必需)**:线程池所能容纳的最大线程数。当活跃线程数达到该数值后,后续的新任务将会阻塞。
- **keepAliveTime(必需)**:线程闲置超时时长。如果超过该时长,非核心线程就会被回收。如果将 allowCoreThreadTimeout 设置为 true 时,核心线程也会超时回收。
- **unit(必需)**:指定 keepAliveTime 参数的时间单位。常用的有:TimeUnit.MILLISECONDS(毫秒)、TimeUnit.SECONDS(秒)、TimeUnit.MINUTES(分)。
- **workQueue(必需**):任务队列。通过线程池的 execute() 方法提交的 Runnable 对象将存储在该参数中。其采用阻塞队列实现。
- threadFactory(可选):线程工厂。用于指定为线程池创建新线程的方式。
- handler(可选):拒绝策略。当达到最大线程数时需要执行的饱和策略。
2、常用的线程池创建方式(不推荐使用):
- 定长线程池(FixedThreadPool)
- 定时线程池(ScheduledThreadPool )
- 可缓存线程池(CachedThreadPool)
- 单线程化线程池(SingleThreadExecutor)