概念:
线程池就是提前创建好一批线程,保存到线程池中,当有任务需要执行的时候,从线程池中选一个线程来执行任务。
比较典型的池化技术:
线程池、连接池、对象池
Executors:
Executors创建出来的线程池都实现了ExecutorService接口,常用的方法:
1、newFixedThreadPool(int nThreads):创建固定数量线程的线程池
2、newCachedThreadPool():创建一个可缓存的线程池,调用execute将重用以前构造的线程,如果没有可用的线程则创建一个新得线程并添加到线程池中,终止并从缓存中移除那些超过60s没有被使用得线程
3、newSingleThreadExecutor():创建一个单线程的线程池
线程池的参数说明:
1、acc? ? :获取调用上下文
2、corePoolSize:核心线程数
3、maximumPoolSize:最大线程数
4、workQueue:多余任务等待队列
5、keepAliveTime:非核心线程空闲时间,当当前线程数大于corePoolSize数时,多余的线程空闲时间达到keepAliveTime时,多余的线程就会被销毁。
6、threadFactory:创建线程的工厂
7、handler:拒绝策略
corePoolSize、maximumPoolSize、workQueue之间关系:
1、当线程池中线程数小于核心线程数的时候,新提交的任务直接创建一个新的线程执行任务,即使线程池中有空闲的线程
?? ?2、当线程池线程数达到核心线程数的时候,新提交的任务将被放到阻塞队列当中,等待线程池中的任务调度执行
?? ?3、当阻塞队列已满,且最大线程数大于核心线程数的时候,新提交的任务会创建非核心线程去执行任务
?? ?4、当阻塞队列已满,提交的任务数超过最大线程数直接走拒绝策略
线程池的拒绝策略:
1、AbortPolicy:不在执行新任务,直接抛出异常?(默认策略)
2、DiscardPolicy:这个策略在队列任务已满时,会丢弃新的任务不会抛异常,新任务提交后会被默默丢弃,不会有任何提示,用于日志记录? ?(丢弃策略)
3、DiscardOldestPolicy:这个策略也是丢弃新的任务,但是会尝试将任务队列中最早的任务删除,在尝试提交新的任务(更新策略)
4、CallerRunsPolicy:这个策略将任务回退给调用线程,而不会抛出异常(回退策略)