一、线程池定义和使用
jdk 1.5 之后就引入了线程池。
1.1 定义
从上面的空间切换看得出来,线程是稀缺资源,它的创建与销毁是一个相对偏重且耗资源的操作,而Java线程依赖于内核线程,创建线程需要进行操作系统状态切换。为避免资源过度消耗需要设法重用线程执行多个任务。线程池就是一个线程缓存,负责对线程进行统一分配、调优与监控。(数据库连接池也是一样的道理)
什么时候使用线程池?
单个任务处理时间比较短;需要处理的任务数量很大。
线程池优势?
- 重用存在的线程,减少线程创建、消亡的开销,提高性能、提高响应速度。
- 当任务到达时,任务可以不需要等到线程创建就能立即执行。
- 提高线程的可管理性,可统一分配,调优和监控。
1.2 线程池在 jdk 已有的实现
- 在 juc 包下,有一个接口:Executor :
- Executor 又有两个子接口:ExecutorService 和 ScheduledExecutorService,常用的接口是 ExecutorService。
- 同时常用的线程池的工具类叫 Executors。
例如:
ExecutorService service = Executors.newCachedThreadPool();
Executor 框架虽然提供了如 newFixedThreadPool()、newSingleThreadExecutor()、newCachedThreadPool()、newScheduledThreadPool() 等创建线程池的方法,但都有其局限性,不够灵活。
上面的几中方式点进去会发现,都是用 ThreadPoolExecutor 进行创建的:
- newSingleThreadExecutor 字面意思 简单线程执行器。
- newFixedThreadPool 字面意思固定的线程池,传参就是线程固定数目,适用于执行长期任务的场景。
- newCachedThreadPool 字面意思 缓存线程池,核心线程0,最大线程非常大,动态创建的特点。
- newScheduledThreadPool 字面意思 时间安排线程池,指定核心线程数。
- newSingleThreadScheduledExecutor 字面意思 单线程安排执行器,也就是基于只有一个核心线程的执行器之外,又可以扩展。其中又用 DelegatedEx