为什么需要线程池
- 在Java中,如果每当一个请求到达就创建一个新线程,开销是相当大的。在实际使用中,每个请求创建新线程的服务器在创建和销毁线程上花费的时间和消耗的系统资源,甚至可能要比花在处理实际的用户请求的时间和资源要多得多。
- 线程缺乏统一管理,可能无限制新建线程,相互之间竞争。
- 缺乏扩展性
- 缺乏可重用性
什么时候需要线程池
- 当一个Web服务器接受到大量短小线程的请求时,使用线程池技术是非常合适的,它可以大大减少线程的创建和销毁次数,提高服务器的工作效率。
- 需要提供定时执行、定期执行、单线程、并发数控制等功能。
java线程池
Java8共有7种线程池,分别是:
1. newCachedThreadPool
- 缓存型线程池
- 可根据需要灵活回收空闲线程
- 可根据需要新建线程
- 通常用于执行生命周期很短的异步型任务
2. newFixedThreadPool
- 定长线程池
- 固定数目的线程数
- 控制最大并发数
3. newScheduledThreadPool
- 调度型线程池/定长/定时/周期性任务
4. newSingleThreadExecutor
- 单例线程
- 保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行
5. newSingleThreadScheduledExecutor
- 一个线程
- 可在指定延迟后执行线程
6. ExecutorService newWorkStealingPool(int parallelism)
- 创建持有足够线程的线程池来支持给定的并行级别
- 使用多个队列减少竞争
7. ExecutorService newWorkStealingPool()
- 上一个方法的简化版
- 并行级别依cpu而定
总结
java通过多线程的方式来实现并发,为了方便的管理线程,JAVA采用线程池的方式对线线程的整个生命周期进行管理。