线程池好处 ?
像个池子一样管理线程,之前创建一个线程需要开辟虚拟机栈、本地方法栈、程序计数器等私有的内存空间,在销毁的时候又要回收这些资源,频繁的创建于销毁会浪费大量的系统资源。
好处:
- 管理并复用线程,控制最大并发数等。
- 有任务线程队列缓存策略和拒绝机制
- 实现某些与时间相关的功能,如定时任务、周期执行等。
相关类关系图
如何使用线程池创建线程
一般来说,工作里面有两种方式来创建,
- 一种是通过已有的工具类Executors来创建
- 通过ThreadPoolExecutor这个类来进行创建。
两种方式比较
- Executors创建的话,更加简单,因为内部都已经封装好了参数
- ThreadPoolExecutor创建的话更加灵活一点,其中有7个参数
corePoolSize: 核心线程数
maximumPoolSize: 最大线程数
keepAliveTime: 线程空闲时间,当达到这个时间的时候就会被摧毁,需要注意的是不包括核心线程数corePoolSize
TimeUnit: keepAliveTime的单位
workQueue: 缓存队列,当线程数达到maximumPoolSize时候,就会进入到缓存队列里取,如: ArrayBlockingQueue、LinkedB lockingQueue
threadFactory :表示线程工厂,生产一组相同任务的线程
handler: 拒绝策略,当达到workQueue的时候可以通过拒绝策略拒绝请求,这是一种限流保护。 - 阿里java开发手册
常用的类
ScheduledThreadPoolExecutor: 周期性的执行定时任务