火遍全网的Hutool使用Builder模式创建线程池的方法

 更新时间:2021年03月16日 09:27:27   作者:源码兴趣圈  
这篇文章主要介绍了火遍全网的Hutool使用Builder模式创建线程池的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

前言

Builder 设计模式也叫做 构建者模式或者建造者模式,名字只是一种叫法,当聊起三种名称的时候知道是怎么回事就行

Builder 设计模式在作者编码过程中,属于比较常用的模式之一。优秀的设计模式总是会受到广大开发者的青睐,Hutool 也是其中之一

因为上周编写的业务需要用到线程池,就去 Hutool thread 包下看了看,还真有惊喜,学习到了一种之前编码中没用过的 Builder 模式实现

这里必须提一句:设计模式重要的是思想,一种设计模式可能不止一种实现方式

Builder 模式文章大纲如下:

  1. Builder 模式应用场景
  2. Hutool 线程池如何应用 Builder 模式
  3. Builder 模式不同的实现方式
  4. Builder 模式总结

Builder 模式应用场景


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

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

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

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

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

  1. 核心线程数不可以小于 0
  2. 线程存活时间不可以小于 0
  3. 最大线程数不可以小于等于 0,同时也不可以小于核心线程数
  4. 阻塞队列、线程工厂、拒绝策略参数均不可为空

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

小伙伴想一哈线程池创建是不是灰常灰常适合 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模式创建线程池内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中用POI实现将数据导出到Excel

    Java中用POI实现将数据导出到Excel

    这篇文章主要介绍了Java中用POI实现将数据导出到Excel,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • C++ 程序流程结构详解

    C++ 程序流程结构详解

    这篇文章主要介绍了C++程序的程序流程结构以及关系和逻辑运算符讲解,是C++入门学习中的基础知识,需要的朋友可以参考下
    2021-09-09
  • java ThreadPool线程池的使用,线程池工具类用法说明

    java ThreadPool线程池的使用,线程池工具类用法说明

    这篇文章主要介绍了java ThreadPool线程池的使用,线程池工具类用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • SpringBoot分页的实现与long型id精度丢失问题的解决方案介绍

    SpringBoot分页的实现与long型id精度丢失问题的解决方案介绍

    在以后的开发中,当全局唯一id的生成策略生成很长的Long型数值id之后会超过JS对Long型数据处理的能力范围,可能发生精度丢失而造成后端方法失效,我们要学会解决。分页功能虽然简单但是非常重要,对于刚接触项目的人一定要重点注意
    2022-10-10
  • SpringBoot从0到1整合银联无跳转支付功能附源码

    SpringBoot从0到1整合银联无跳转支付功能附源码

    这篇文章主要介绍了SpringBoot从0到1整合银联无跳转功能支付附源码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Java 十大排序算法之冒泡排序刨析

    Java 十大排序算法之冒泡排序刨析

    冒泡排序是一种简单的排序算法,它也是一种稳定排序算法。其实现原理是重复扫描待排序序列,并比较每一对相邻的元素,当该对元素顺序不正确时进行交换。一直重复这个过程,直到没有任何两个相邻元素可以交换,就表明完成了排序
    2021-11-11
  • Java 中导入excel时使用 trim() 无法去除空格的问题解决方案

    Java 中导入excel时使用 trim() 无法去除空格的问题解决方案

    这篇文章主要介绍了Java中导入excel时使用trim()无法去除空格的解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • 分享关于JAVA 中使用Preferences读写注册表时要注意的地方

    分享关于JAVA 中使用Preferences读写注册表时要注意的地方

    这篇文章介绍了关于JAVA 中使用Preferences读写注册表时要注意的地方,有需要的朋友可以参考一下
    2013-08-08
  • Mybatis中自定义TypeHandler处理枚举详解

    Mybatis中自定义TypeHandler处理枚举详解

    本文主要介绍了Mybatis中自定义TypeHandler处理枚举的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • Java运行时数据区概述详解

    Java运行时数据区概述详解

    这篇文章主要介绍了Java运行时数据区概述,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03

最新评论