1. 线程池架构
JDK提供两种线程池类型,一种是ThreadPoolExcutor,一种是ForkJoinPool. 本节课重点讲解ThreadPoolExcutor。
线程池做的工作主要是控制运行的线程的数量,处理过程中将任务加入队列,然后在线程创建后启动这些任务,如果显示超过了最大数量,超出的数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行
java中的线程池是通过 Excutor 框架实现的,该框架用到了 Excutor,Excutors,ExcutorService, ThreadPoolExcutor 这几个类。
主要特点为:线程复用 | 控制最大并发数 | 管理线程.
2.ThreadPoolExecutor
2.1 线程池分类(四类线程池的底层都是ThreadPoolExecutor)
(1).Executors.newFixedThreadPool(int) : 一池N线程
(2).Executors.newSingleThreadExecutor( ) : 一池一线程
(3).Executors.newCachedThreadPool( ) : 一池可扩容线程
(4).Executors.newScheduledThreadPool( ) : 创建一个定长线程池, 支持定时及周期性任务执行。
2.2 七个参数
①. corePoolSize:线程池中的常驻核心线程数
在创建了线程池后,当有请求任务来之后,就会安排池中的线程去执行请求任务,近似理解为今日当值线程;当线程池中的线程数目达到corePoolSize后,就会把到达的任务放入到缓存队列当中.
②. maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值大于等于1
③. keepAliveTime:多余的空闲线程存活时间,当空间时间达到keepAliveTime值时,多余的线程会被销毁直到只剩下corePoolSize个线程为止(非核心线程)
④. unit:keepAliveTime的单位
⑤. workQueue:任务队列,被提交但尚未被执行的任务(候客区)
⑥. threadFactory:表示生成线程池中工作线程的线程工厂,用户创建新线程,一般用默认即可(银行网站的logo | 工作人员的制服 | 胸卡等)
⑦. handler:拒绝策略,表示当线程队列满了并且工作线程大于等于线程池的最大显示 数(maxnumPoolSize)时如何来拒绝
2.3 工作流程
2.3.1 流程图:一句话就是优先核心线程,阻塞队列次之,最后非核心线程,最终拒绝策略
2.3.2 解释
3. 考点:线程池用过吗?生产上你是如何设置合理参数
3.1 线程池的拒绝策略
①. 等待队列也已经排满了,再也塞不下新的任务了。同时,线程池的maximumPoolSize也到达了,无法接续为新任务服务,这时我们需要拒绝策略机制合理的处理这个问题
②. JDK内置的拒绝策略
3.2 你在工作中单一的/固定数的/可变你的三种创建线程池的方法,你用哪个多?超级大坑?
①. 答案是一个都不用,我们生产上只能使用自定义的
②. Executors中JDK给你提供了为什么不用?
参考阿里巴巴java开发手册
3.3 你在工作中是如何创建线程池的,是否自定义过线程池使用
public class MyThreadPoolDemo {
public static void main(String[] args) {
ExecutorService threadPool = new ThreadPoolExecutor(
2,
5,
1L,
TimeUnit.SECONDS,
new LinkedBlockingDeque<Runnable>(3),
Executors.defaultThreadFactory(),
//默认抛出异常
//new ThreadPoolExecutor.AbortPolicy()
//回退调用者
//new ThreadPoolExecutor.CallerRunsPolicy()
//处理不来的不处理,丢弃时间最长的
//new ThreadPoolExecutor.DiscardOldestPolicy()
//直接丢弃任务,不予任何处理也不抛出异常
new ThreadPoolExecutor.DiscardPolicy()
);
//模拟10个用户来办理业务 没有用户就是来自外部的请求线程.
try {
for (int i = 1; i <= 10; i++) {
threadPool.execute(() -> {
System.out.println(Thread.currentThread().getName() + "\t 办理业务");
});
}
} catch (Exception e) {
e.printStackTrace();
} finally {
threadPool.shutdown();
}
//threadPoolInit();
}
}
3.4 合理配置线程池你是如何考虑的?
①. CPU密集型
②. IO密集型
标签:ThreadPool,Executors,队列,JUC2,任务,线程,new,ThreadPoolExecutor From: https://blog.51cto.com/u_15905340/5919715