线程池技术想必大家都不陌生把,相信在平时的工作中没有少用,而且这也是面试频率非常高的一个知识点,那么大家知道它的实现原理和细节吗?如果直接去看jdk源码的话,可能有一
线程池技术想必大家都不陌生把,相信在平时的工作中没有少用,而且这也是面试频率非常高的一个知识点,那么大家知道它的实现原理和细节吗?如果直接去看jdk源码的话,可能有一定的难度,那么我们可以先通过手写一个简单的线程池框架,去掌握线程池的基本原理后,再去看jdk的线程池源码就会相对容易,而且不容易忘记。 线程池框架设计我们都知道,线程资源的创建和销毁并不是没有代价的,甚至开销是非常高的。同时,线程也不是任意多创建的,因为活跃的线程会消耗系统资源,特别是内存,在一定的范围内,增加线程可以提高系统的吞吐率,如果超过了这个范围,反而会降低程序的执行速度。 因此,设计一个容纳多个线程的容器,容器中的线程可以重复使用,省去了频繁创建和销毁线程对象的操作, 达到下面的目标:
线程池的核心思想: 线程复用,同一个线程可以被重复使用,来处理多个任务。 为了实现线程池功能,需要考虑下面几个设计要点:
看了上面的设计目标和要点,是不是能立刻想到一个非常经典的设计模型——生产者消费者模型。
现在我们将我们的设计思路转换为代码。 代码实现阻塞队列的实现
线程池消费端实现1.定义执行器接口
2.定义线程池类实现该接口
3.演示
运行结果: 获取任务超时设计目前从队列中获取任务是永久阻塞等待的,可以改成阻塞一段时间没有获取任务,丢弃的策略。
新加TimeoutBlockingQueue类,添加offer和poll待超时的添加和获取任务的方法。 拒绝策略设计目前的实现还是有个漏洞,无法自定义任务超出阈值的一个拒绝策略,我们可以通过利用函数式编程+策略模式去实现。 1.定义策略模式的函数式接口
2.添加函数式接口的调用入口 我们可以在阻塞队列添加任务新加一个api, 添加任务如果超过容量,调用函数式接口。
3.修改ThreadPool类
通过构造方法的方式传入要执行的拒绝策略 调用tryPut方法添加任务 4.演示 |
2021-06-05
2021-05-27
2021-05-26
2021-06-05
2021-05-16