当前位置: 首页 > 科技观察

如何使用Builder模式搭建线程池

时间:2023-03-14 22:24:37 科技观察

本文转载自微信公众号“源码兴趣圈”,作者龙泰。转载本文请联系源码兴趣圈公众号。前言Builder设计模式也称为建造者模式或建造者模式。名字只是一个名字。说到三个名字,就知道是怎么回事了。Builder设计模式是作者编码过程中比较常用的模式之一。一。优秀的设计模式总是受到广大开发者的青睐,Hutool就是其中之一。因为上周写的业务需要用到线程池,就去Hutool线程包看了一下。我真的很惊讶。之前学过一种Builder模式的实现,在编码中从来没有用过这里不得不提一下:设计模式重要的是思路,一个设计模式可能有不止一种Builder模式的实现方式。不同实现方式Builder模式总结Builder模式应用场景Builder模式适用范围:如果类的属性之间存在一定的依赖关系或约束(源于设计模式之美),那么可以考虑使用Builder设计模式。我们以线程池为例,默认创建的线程池在构造方法中最多有七个参数,核心线程数、最大线程数、阻塞队列、线程生存时间……创建时一个日常使用的线程池,为什么要这样设计呢?查看源代码注释中如何解释此行为。线程池之所以设置这么多的构造参数,是因为有一定的规则来检查这些参数。如果不满足线程池的规则,则不允许创建线程池。通过抛出异常来终止程序大概有七种规则。这里有几个:核心线程数不能小于0线程存活时间不能小于0最大线程数不能小于等于0,核心线程数不能阻塞队列,threadfactory,拒绝策略参数不能为空。以上七点有两个作用。一是让核心参数满足线程池运行过程,二是保证运行时的稳定性。小伙伴们想创建线程池是不是经常适合Builder模式?构造函数太多,属性之间存在依赖和约束。HutoolBuilder创建一个线程池。Builder设计模式有两个相关的用法,一个是创建线程池,一个是创建线程池。就是创建一个线程工厂。我们专注于线程池,说创建Hutool线程池比较简单优雅。笔者比较喜欢这种链式风格,所以在抽象公共服务的时候会采用这种模式。如图,此时跟随源码,首先从ExecutorBuilder#create开始,小伙伴们就会明白Hutool是怎么玩Builder模式的publicstaticExecutorBuildercreate(){returnnewExecutor建设者();}什么?自己创造?这就是你想要做的。想一想,如果要对类中的属性进行约束,前提是你要先获取到属性。是的,ExecutorBuilder#create方法自己返回By,然后使用set方法将数据填充到创建的对象中,最后整理一下依赖和条件约束,看看ExecutorBuilder#build方法内部做了什么。这里有一个知识点,也是B格之一。大家看到build方法上的@Override注解,证明它实现了接口方法Hutool定义了Builder接口,实现这个接口就可以完成Builder模式。泛型T表示需要返回的构造对象的类型,比如刚才的线程池Builder泛型,即ThreadPoolExecutor调用了build方法(ExecutorBuilderbuilder),实际上是管理build方法实现的依赖和约束,并将新建赋值的构建对象传递给最终的构建(ExecutorBuilder构建器)返回我们需要的线程池对象,大家可以自己跟着源码学习,应用自己的业务代码Hutool版本:5.0.6源码包路径:cn.hutool.core.threadBuilder不同实现的模式上面说过,设计模式是重思想,就像Builder模式一样,强调依赖或约束的管理。刚才,HutoolBuilder只是一个实现方法。之前用过静态内部类的实现方法。除了不过笔者测试过,可以粘贴到IDEA中编译。@GetterpublicclassHttpParameters{privateBuilderbuilder;publicstaticBuildernewBuilder(){returnnewBuilder();}privateHttpParameters(Builderbuilder){this.builder=builder;}@GetterpublicstaticclassBuilder{privateStringurl;privateObjectparameter(privateObjectparameterhttpparameter;p){this.parameter=parameter;returnthis;}publicBuilderurl(Stringurl){this.url=url;returnthis;}publicBuilderhttpType(StringhttpType){this.httpType=httpType;returnthis;}publicHttpParametersbuild(){if(StringUtils.isBlank(url)){thrownewRuntimeException("URL不允许为空");}//...returnnewHttpParameters(this);}}}如果后面要获取HttpParameters参数,需要先获取Builder对象。可能有些朋友不习惯这种方法。也可以在Parameters中定义Builder对象属性的副本,方法非常灵活。结语本文通过创建线程池的方式介绍Builder设计模式的场景和实际使用,并使用HutoolBuilder模式创建线程池进行讲解。相信看完之后,你会对Builder模式的场景和应用有更深入的了解。另外,我们可以把Builder模式引入到自己的代码中去实践一下。我相信你也会喜欢它。另外,笔者之前对线程池进行了自我封装,同时使用了Builder和模板方法,并重写了部分线程池方法,使用起来更方便,排查问题也更方便。