分析:我们如何理解这幅图呢,以及我们可以简单对它们进行简单的模仿?
1. 核心线程池就像相当于我们互联网公司的核心成员。
2. 当任务来的时候,核心线程池进行消费,当任务比较多的时候,由产品经理把任务统计起来(就是任务队列),如果产品经理发现任务多的已经统计不过来,说明任务队列已经满了。
3. 在任务队列里面任务太多的时候,公司就会进行招聘一些外包人员,这时的线程就是核心线程以外的线程,并且会把它们放到一个线程池中,让这些外包也来完成产生的任务,但是这时候外包人员也不能处理产生的任务
4.就会产生一种策略,其实这些策略就是异常处理,在jdk提供了四种处理异常的策略
异常策略:
- CallerRunsPolicy:只要线程池没关闭,就直接用调用者所在线程来运行任务
- AbortPolicy:直接抛出 RejectedExecutionException 异常
- DiscardPolicy:悄悄把任务放生,不做了
- DiscardOldestPolicy:把队列里待最久的那个任务扔了,然后再调用 execute() 试试看能行不
ThreadPoolExecutor:
分析:我们可以看到jdk里面提供的四种线程池里面最后都是调用threadpoolexecutor这个类,但是这个类里面有7个参数,分别
corePoolSize:核心线程大小(及互联网公司的核心成员)
maximumPoolSize:最大线程池的大小(外包人员)
keepAliveTime:除过核心线程池外,其他线程的存活时间。(及外包人员的存活时间)
unit:创建线程的存活时间
workQueue:任务队列,在jdk里面提供四种任务队列
- ArrayBlockingQueue:基于数组、有界,按 FIFO(先进先出)原则对元素进行排序
- LinkedBlockingQueue:基于链表,按FIFO (先进先出) 排序元素
- SynchronousQueue:不存储元素的阻塞队列
- PriorityBlockingQueue:具有优先级的、无限阻塞队列
threadFactory:线程工厂,对线程进行管理
策略模式:出现异常时,使用的策略。
1. newFixedThreadPool:
分析:keepAliveTime为0,说明只有核心线程池,产生的核心线程池以外的线程,它们的存活时间将变为0,那么在极端情况下,如果任务比较多的话,会很快使任务队列已满,可以用于负载比较重的服务器。
2. newSingleThreadExecutor:
分析:是上面newFixThreadPool的一个特例,里面核心线程只有一个,没有其他多余的线程, 用于串行执行任务的场景,每个任务必须按顺序执行,不需要并发执行。
3. newCachedThreadPool:
分析:可以看出corePoolSize的大小为0,可以说全是外包,极端情况下会创建过多的线程,耗尽 CPU 和内存资源。
用于并发执行大量短期的小任务,或者是负载较轻的服务器。
4. newScheduledThreadPool:
分析: 用于需要多个后台线程执行周期任务,同时需要限制线程数量的场景。
1. 首先一定这个线程池的行为规范有哪些
- 执行线程的接口
- 得到当前任务队列(这个任务队列就是池子,让生产者生产任务,让消费者任务)里面的任务数量
- 得到当前任务队列里面已经消费的任务数量
- 得到当前的工作线程数量
2. 定义ThreadManagePool这个类
- 首先需要实现ThreadPool的行为规范
- 需要定义消费者类,这个类主要是消费任务,但是必须把它和生产者结合起来,它必须只要什么时候需要消费,在这里使用一个链表,把两者结合起来,消费者必须每一次检查链表是不是空,如果是空的,就进行等待,直到链表不为空,进行消费。
- 销毁线程,首先要检查任务队列里面的任务是否消费完毕,如果没有完毕进行等待处理,如果消费完毕,关闭每一个消费者,在关闭线程池。
分析:发现虽然我们初始化许多线程,但是只有一个线程在消费队列里面的任务,主要是因为使用的同一把锁,一次只能让一个线程进入进行消费,是一个串行的过程,有点像jdk里面的singleNewThreadPool这个线程池,还有问题就是我们解耦,通过链表把消费者和生成者联系起来,所以我们应该用一个工具来管理线程,这个类ThreadFactory。
ThreadFactory类代码:
运行类代码:
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/kjbd-yiny/71527.html