火遍全网的Hutool使用Builder模式创建线程池的方法
前言
Builder 设计模式也叫做 构建者模式或者建造者模式,名字只是一种叫法,当聊起三种名称的时候知道是怎么回事就行
Builder 设计模式在作者编码过程中,属于比较常用的模式之一。优秀的设计模式总是会受到广大开发者的青睐,Hutool 也是其中之一
因为上周编写的业务需要用到线程池,就去 Hutool thread 包下看了看,还真有惊喜,学习到了一种之前编码中没用过的 Builder 模式实现
这里必须提一句:设计模式重要的是思想,一种设计模式可能不止一种实现方式
Builder 模式文章大纲如下:
- Builder 模式应用场景
- Hutool 线程池如何应用 Builder 模式
- Builder 模式不同的实现方式
- Builder 模式总结
Builder 模式应用场景
Builder 模式作用域:如果类的属性之间有一定的依赖关系或者约束条件(源自设计模式之美),那么就可以考虑使用 Builer 设计模式
我们依照线程池来举例,默认创建的线程池,构造方法最多有七个参数,核心线程数、最大线程数、阻塞队列、线程存活时间…
日常使用创建线程池时,大家想一下为什么要这么设计?一起来看下源码注释中如何解释此行为
线程池之所以设置如此之多的构造参数,是因为对这些参数会有一定规则的校验,如果不满足线程池的规则,将不允许创建线程池,通过抛异常的方式终止程序
终止规则大概有七点,这里列举一下:
- 核心线程数不可以小于 0
- 线程存活时间不可以小于 0
- 最大线程数不可以小于等于 0,同时也不可以小于核心线程数
- 阻塞队列、线程工厂、拒绝策略参数均不可为空
上述七点有两个作用,其一是为了让核心参数满足线程池运行流程,其二是为了保障运行时的稳定性
小伙伴想一哈线程池创建是不是灰常灰常适合 Builder 模式,构造器函数过多以及属性之间存在依赖关系和约束条件
Hutool Builder 创建线程池
Hutool 线程池相关使用 Builder 设计模式有两处,一个是创建线程池,另一个是创建线程工厂,我们重点围绕线程池说
创建 Hutool 线程池比较简单且优雅,笔者较喜欢这种链式风格,所以抽象公共业务时都会使用此模式,如图所示
这个时候跟下源码,先从 ExecutorBuilder#create
入手,小伙伴就明白 Hutool 是如何玩 Builder 模式了
public static ExecutorBuilder create() { return new ExecutorBuilder(); }
What? 自己创建自己?这是要搞啥子
小伙伴想一下,如果你想要对一个类中属性进行约束,前提是不是先应该把属性搞到手
没错,ExecutorBuilder#create
方法返回自己本身,然后通过 set 方法 把数据填充到创建出来的对象上,最后再进行依赖关系整理和条件约束
看一下 ExecutorBuilder#build
方法内部做了什么事情
这里有个知识点,也是B格之一,大家看到 build 方法上有 @Override 注解,证明它是实现了接口方法
Hutool 定义了 Builder 接口,实现此接口即可完成 Builder 模式,泛型 T 代表需要返回的构造对象类型,比如刚才线程池 Builder 泛型就是 ThreadPoolExecutor
在实现 build 方法上调用真正管理依赖和约束的方法 build(ExecutorBuilder builder),将刚才创建好并且已经赋过值的构建对象传入
最后 build(ExecutorBuilder builder) 返回的就是我们所需要的线程池对象,这一块大家可以自己跟下源码,学会就可以套用自己写的业务代码
Hutool Version:5.0.6
源码包路径:cn.hutool.core.thread
Builder 模式不同的实现方式
上文说过,设计模式重思想,就像 Builder 模式,强调的是 管理依赖关系或者约束条件
刚才 Hutool Builder 只是一种实现方式,之前还用过静态内部类的实现方式
代码经过精剪,并且为了阅读体验感,把部分缩进去除了。不过笔者测试过粘贴到 IDEA 中编译是可以的
@Getter public class HttpParameters { private Builder builder; public static Builder newBuilder() { return new Builder(); } private HttpParameters(Builder builder) { this.builder = builder; } @Getter public static class Builder { private String url; private Object parameter; private String httpType; public Builder parameter(Object parameter) { this.parameter = parameter; return this;} public Builder url(String url) { this.url = url; return this; } public Builder httpType(String httpType) { this.httpType = httpType; return this; } public HttpParameters build() { if (StringUtils.isBlank(url)) {throw new RuntimeException("URL不允许为空 "); } // ... return new HttpParameters(this); } } }
如果后面要获取 HttpParameters 参数就需要先获取 Builder 对象
可能有些小伙伴不习惯这种方式,也可以把 Builder 对象属性在 Parameters 里也定义一份,方式都很灵活
结言
本文通过创建线程池为引,讲述了 Builder 设计模式的场景以及实际用途,并引用 Hutool Builder 模式创建线程池进行讲解。相信大家看完之后对 Builder 模式的场景以及应用有了更深入的了解,另外我们可以将 Builder 模式引入到自己代码中,实际操练一下,相信你也会对它 “爱不释手”
另外,早之前笔者使用线程池都是自己封装,同时用到了 Builder、模版方法 两种模式,并且重写了部分线程池方法,使用以及排查问题都比较顺手。因为篇幅有限这里就不贴了,需要的小伙伴可以添加微信自取
关于 Builder 设计模式本文就讲到这里,后面会陆续输出策略、工厂、责任链等模式;
到此这篇关于火遍全网的Hutool使用Builder模式创建线程池的方法的文章就介绍到这了,更多相关Builder模式创建线程池内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!
相关文章
基于springcloud异步线程池、高并发请求feign的解决方案
这篇文章主要介绍了基于springcloud异步线程池、高并发请求feign的解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-25- 这篇文章主要介绍了Java线程池中的各个参数如何合理设置操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-19
- 在Java中,我们可以利用多线程来最大化地压榨CPU多核计算的能力,下面这篇文章主要给大家介绍了关于java中多线程与线程池基本使用的相关资料,需要的朋友可以参考下...2021-09-13
- 这篇文章主要介绍了教你如何监控 Java 线程池运行状态的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-27
- 这篇文章主要介绍了C#多线程ThreadPool线程池的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- IOS开发目前最主流的框架当属SwiftUI了,这篇文章主要给大家介绍了关于SwiftUI中@ViewBuilder的一些相关知识点,文中通过示例代码介绍的非常详细,需要的朋友可以参考下...2021-07-08
- 这篇文章主要介绍了js实现C#的StringBuilder效果,以完整实例形式分析总结了js实现C#的StringBuilder效果的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2015-12-24
java并发包中CountDownLatch和线程池的使用详解
这篇文章主要介绍了java并发包中CountDownLatch和线程池的使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-18- 在C#编程语言中,使用线程池可以并行地处理工作,当强制线程和更新进度条时,会使用内建架构的ThreadPool类,为批处理使用多核结构,这里我们来看在C#编程语言中一些关于来自System.Threading的ThreadPool的用法的例子...2020-06-25
- 本篇文章主要是对C#中StringBuilder类的使用方法进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助...2020-06-25
- 今天我们来学习一下Java ThreadPoolExecutor的使用,文中有非常详细的介绍及代码示例,对正在学习Java的小伙伴们有很大的帮助,需要的朋友可以参考下...2021-05-15
C#中String StringBuilder StringBuffer类的用法
这篇文章给大家简单介绍下C#中String StringBuilder StringBuffer三个类的用法,需要的的朋友参考下吧...2020-06-25- 这篇文章主要介绍了Java常用工具类库——Hutool的使用简介,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下...2021-04-12
SqlCommandBuilder类批量更新excel或者CSV数据的方法
这篇文章主要介绍了SqlCommandBuilder类批量更新excel或者CSV数据的方法,需要的朋友可以参考下...2021-09-22C#中string和StingBuilder内存中的区别实例分析
这篇文章主要介绍了C#中string和StingBuilder内存中的区别,以实例形式演示了二者在内存中的不同之处,需要的朋友可以参考下...2020-06-25详解java中String、StringBuilder、StringBuffer的区别
这篇文章主要介绍了java中String、StringBuilder、StringBuffer的区别,文中讲解的很清晰,有对于这方面不太懂的同学可以研究下...2021-02-25- 这篇文章介绍了c++ builder TreeView控件节点遍历代码,有需要的朋友可以参考一下...2020-04-25
- 下面小编就为大家带来一篇深入理解StringBuilder的使用方法。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
基于C++11的threadpool线程池(简洁且可以带任意多的参数)
C++11 加入了线程库,从此告别了标准库不支持并发的历史。然而 c++ 对于多线程的支持还是比较低级,稍微高级一点的用法都需要自己去实现,譬如线程池、信号量等...2020-04-25- 这篇文章主要介绍了Java 自定义线程池和线程总数控制操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-27