温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

使用Builder模式怎么构建线程池

发布时间:2021-08-10 16:38:37 来源:亿速云 阅读:158 作者:Leah 栏目:web开发

这篇文章将为大家详细讲解有关使用Builder模式怎么构建线程池,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

Builder 模式应用场景

Builder 模式作用域:如果类的属性之间有一定的依赖关系或者约束条件(源自设计模式之美),那么就可以考虑使用 Builer 设计模式

我们依照线程池来举例,默认创建的线程池,构造方法最多有七个参数,核心线程数、最大线程数、阻塞队列、线程存活时间...

日常使用创建线程池时,大家想一下为什么要这么设计?一起来看下源码注释中如何解释此行为

使用Builder模式怎么构建线程池

线程池之所以设置如此之多的构造参数,是因为对这些参数会有一定规则的校验,如果不满足线程池的规则,将不允许创建线程池,通过抛异常的方式终止程序

终止规则大概有七点,这里列举一下:

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 核心线程数不可以小于 0

  3. 线程存活时间不可以小于 0

  4. 最大线程数不可以小于等于 0,同时也不可以小于核心线程数

  5. 阻塞队列、线程工厂、拒绝策略参数均不可为空

上述七点有两个作用,其一是为了让核心参数满足线程池运行流程,其二是为了保障运行时的稳定性

小伙伴想一哈线程池创建是不是灰常灰常适合 Builder 模式,构造器函数过多以及属性之间存在依赖关系和约束条件

Hutool Builder 创建线程池

Hutool 线程池相关使用 Builder 设计模式有两处,一个是创建线程池,另一个是创建线程工厂,我们重点围绕线程池说

创建 Hutool 线程池比较简单且优雅,笔者较喜欢这种链式风格,所以抽象公共业务时都会使用此模式,如图所示

使用Builder模式怎么构建线程池

这个时候跟下源码,先从 ExecutorBuilder#create 入手,小伙伴就明白 Hutool 是如何玩 Builder 模式了

public static ExecutorBuilder create() {   return new ExecutorBuilder(); }

What?自己创建自己?这是要搞啥子

小伙伴想一下,如果你想要对一个类中属性进行约束,前提是不是先应该把属性搞到手

没错,ExecutorBuilder#create 方法返回自己本身,然后通过 set 方法  把数据填充到创建出来的对象上,最后再进行依赖关系整理和条件约束

看一下 ExecutorBuilder#build 方法内部做了什么事情

使用Builder模式怎么构建线程池

这里有个知识点,也是B格之一,大家看到 build 方法上有 @Override 注解,证明它是实现了接口方法

使用Builder模式怎么构建线程池

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);         }     } }

关于使用Builder模式怎么构建线程池就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI