1,为什么要使用线程池?
为每一个请求创建新线程开销很大,服务器在创建和销毁新线程上花费的时间和资源可能比实际处理用户请求的时间和资源更多。在一个jvm中创建太多线程易导致过度消耗内存和线程上下文切换过度,从而影响整个服务器的性能。
2,线程池有什么作用?
可以重用线程,避免创建和销毁带来的开销
控制线程池的并发数,避免大量线程因抢占资源而阻塞
能对线程进行统一管理
3,说说几种常见的线程池及使用场景
newCachedThreadPool 执行很多短期异步的小程序或者负载较轻的服务器
newFixedThreadPool 执行长期的任务,性能好很多
newSingleThreadExecutor 一个任务一个任务执行的场景
NewScheduledThreadPool 周期性执行任务的场景
4,线程池执行流程
- 当线程池小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程。
- 当线程池达到corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行
- 当workQueue已满,且maximumPoolSize>corePoolSize时,新提交任务会创建新线程执行任务
- 当提交任务数超过maximumPoolSize时,新提交任务由RejectedExecutionHandler处理
- 当线程池中超过corePoolSize线程,空闲时间达到keepAliveTime时,关闭空闲线程
- 当设置allowCoreThreadTimeOut(true)时,线程池中corePoolSize线程空闲时间达到keepAliveTime也将关闭
5,线程池的几种重要参数(我参考API解释)
corePollSize 存活于池中,即使是处于空闲状态。出费设置了allowCoreThreadTimeOut 属性。
maximumPoolSize 池中允许存在的最大线程数
keepAliveTime 超过核心线程数的空闲线程存活时间
unit 存活时间单位 与keepAliveTime 一起
workQueue 任务队列在任务被执行前存放任务
threadFactory 线程创建工厂
handler 当线程达到最大且队列满时的策略 默认抛出异常
6,进程和线程
进程是资源分配的最小单位 有自己的独立地址空间。线程是进程的一条执行路径。