【主题】
线程池应用及实现原理剖析
【信息】
为什么要用线程池
线程是不是越多越好?
1、线程在java中是一个对象,操作系统的资源,创建、销毁需要时间。如果创建时间+销毁时间>执行时间不划算
2、java对象占用堆内存,操作系统线程占用系统内存,根据jvm规范,一个线程默认最大栈大小1M,这个栈空间是从系统内存中分配的。
3、操作系统需要频繁切换线程上下文,影响性能。
线程池原理 - 概念
- 线程池管理器
- 工作线程
- 任务接口
- 任务队列
线程池API——接口定义和实现类
接口:
- Executor
- ExecutorService
- ScheduleExcutorService
实现类:
- ThreadPoolExecutor
- ScheduledThreadPoolExecutor
线程池API-方法定义
ScheduleExecutorService
线程池API-Executors工具类
- newFixedThreadPoll(int nThreads)
- newCachedThreadPoll()
- newSingleThreadExecutor()
- newScheduledThreadPoll(int corePoolSize)
线程池原理-任务execute过程
线程数量
如何确定合适数量的线程?
- 计算型任务:cpu数量的1-2倍
- IO型任务:相比计算型任务,需多一些线程,要根据具体的IO阻塞时长进行考量决定。如tomcat中默认的最大线程数为:200。也可考量根据需要在一个最小数量和最大数量间自动增减线程数。
有个小窍门:监控CPU的情况,CPU的利用率达到80%,达到充分利用。如果太满的话,证明线程池数量可能太多了,CPU处理不过来;如果太少,就没有合理地利用到。
【思考】
线程池的线程计算方式?
【行动/反馈】
【钩子】
线程池