日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
如何使用Builder模式構(gòu)建線程池

本文轉(zhuǎn)載自微信公眾號「源碼興趣圈」,作者龍臺  。轉(zhuǎn)載本文請聯(lián)系源碼興趣圈公眾號。 

 前言

Builder 設(shè)計模式也叫做 構(gòu)建者模式或者建造者模式,名字只是一種叫法,當聊起三種名稱的時候知道是怎么回事就行

Builder 設(shè)計模式在作者編碼過程中,屬于比較常用的模式之一。優(yōu)秀的設(shè)計模式總是會受到廣大開發(fā)者的青睞,Hutool 也是其中之一

因為上周編寫的業(yè)務(wù)需要用到線程池,就去 Hutool thread 包下看了看,還真有驚喜,學(xué)習(xí)到了一種之前編碼中沒用過的 Builder 模式實現(xiàn)

這里必須提一句:設(shè)計模式重要的是思想,一種設(shè)計模式可能不止一種實現(xiàn)方式

Builder 模式文章大綱如下:

  1. Builder 模式應(yīng)用場景
  2. Hutool 線程池如何應(yīng)用 Builder 模式
  3. Builder 模式不同的實現(xiàn)方式
  4. Builder 模式總結(jié)

Builder 模式應(yīng)用場景

Builder 模式作用域:如果類的屬性之間有一定的依賴關(guān)系或者約束條件(源自設(shè)計模式之美),那么就可以考慮使用 Builer 設(shè)計模式

我們依照線程池來舉例,默認創(chuàng)建的線程池,構(gòu)造方法最多有七個參數(shù),核心線程數(shù)、最大線程數(shù)、阻塞隊列、線程存活時間...

日常使用創(chuàng)建線程池時,大家想一下為什么要這么設(shè)計?一起來看下源碼注釋中如何解釋此行為

線程池之所以設(shè)置如此之多的構(gòu)造參數(shù),是因為對這些參數(shù)會有一定規(guī)則的校驗,如果不滿足線程池的規(guī)則,將不允許創(chuàng)建線程池,通過拋異常的方式終止程序

終止規(guī)則大概有七點,這里列舉一下:

  1. 核心線程數(shù)不可以小于 0
  2. 線程存活時間不可以小于 0
  3. 最大線程數(shù)不可以小于等于 0,同時也不可以小于核心線程數(shù)
  4. 阻塞隊列、線程工廠、拒絕策略參數(shù)均不可為空

上述七點有兩個作用,其一是為了讓核心參數(shù)滿足線程池運行流程,其二是為了保障運行時的穩(wěn)定性

小伙伴想一哈線程池創(chuàng)建是不是灰?;页_m合 Builder 模式,構(gòu)造器函數(shù)過多以及屬性之間存在依賴關(guān)系和約束條件

Hutool Builder 創(chuàng)建線程池

Hutool 線程池相關(guān)使用 Builder 設(shè)計模式有兩處,一個是創(chuàng)建線程池,另一個是創(chuàng)建線程工廠,我們重點圍繞線程池說

創(chuàng)建 Hutool 線程池比較簡單且優(yōu)雅,筆者較喜歡這種鏈式風格,所以抽象公共業(yè)務(wù)時都會使用此模式,如圖所示

這個時候跟下源碼,先從 ExecutorBuilder#create 入手,小伙伴就明白 Hutool 是如何玩 Builder 模式了

 
 
 
 
  1. public static ExecutorBuilder create() { 
  2.   return new ExecutorBuilder(); 

What?自己創(chuàng)建自己?這是要搞啥子

小伙伴想一下,如果你想要對一個類中屬性進行約束,前提是不是先應(yīng)該把屬性搞到手

沒錯,ExecutorBuilder#create 方法返回自己本身,然后通過 set 方法 把數(shù)據(jù)填充到創(chuàng)建出來的對象上,最后再進行依賴關(guān)系整理和條件約束

看一下 ExecutorBuilder#build 方法內(nèi)部做了什么事情

這里有個知識點,也是B格之一,大家看到 build 方法上有 @Override 注解,證明它是實現(xiàn)了接口方法

Hutool 定義了 Builder 接口,實現(xiàn)此接口即可完成 Builder 模式,泛型 T 代表需要返回的構(gòu)造對象類型,比如剛才線程池 Builder 泛型就是 ThreadPoolExecutor

在實現(xiàn) build 方法上調(diào)用真正管理依賴和約束的方法 build(ExecutorBuilder builder),將剛才創(chuàng)建好并且已經(jīng)賦過值的構(gòu)建對象傳入

最后 build(ExecutorBuilder builder) 返回的就是我們所需要的線程池對象,這一塊大家可以自己跟下源碼,學(xué)會就可以套用自己寫的業(yè)務(wù)代碼

  • Hutool Version:5.0.6
  • 源碼包路徑:cn.hutool.core.thread

Builder 模式不同的實現(xiàn)方式

上文說過,設(shè)計模式重思想,就像 Builder 模式,強調(diào)的是 管理依賴關(guān)系或者約束條件

剛才 Hutool Builder 只是一種實現(xiàn)方式,之前還用過靜態(tài)內(nèi)部類的實現(xiàn)方式

代碼經(jīng)過精剪,并且為了閱讀體驗感,把部分縮進去除了。不過筆者測試過粘貼到 IDEA 中編譯是可以的

 
 
 
 
  1. @Getter 
  2. public class HttpParameters { 
  3.     private Builder builder; 
  4.     public static Builder newBuilder() { return new Builder(); } 
  5.     private HttpParameters(Builder builder) { this.builder = builder; } 
  6.  
  7.     @Getter 
  8.     public static class Builder { 
  9.         private String url; 
  10.         private Object parameter; 
  11.         private String httpType; 
  12.         public Builder parameter(Object parameter) { this.parameter = parameter; return this;} 
  13.         public Builder url(String url) { this.url = url; return this; } 
  14.         public Builder httpType(String httpType) { this.httpType = httpType; return this; } 
  15.         public HttpParameters build() { 
  16.             if (StringUtils.isBlank(url)) {throw new RuntimeException("URL不允許為空 "); } 
  17.             // ... 
  18.             return new HttpParameters(this); 
  19.         } 
  20.     } 

如果后面要獲取 HttpParameters 參數(shù)就需要先獲取 Builder 對象

可能有些小伙伴不習(xí)慣這種方式,也可以把 Builder 對象屬性在 Parameters 里也定義一份,方式都很靈活

結(jié)言

本文通過創(chuàng)建線程池為引,講述了 Builder 設(shè)計模式的場景以及實際用途,并引用 Hutool Builder 模式創(chuàng)建線程池進行講解。相信大家看完之后對 Builder 模式的場景以及應(yīng)用有了更深入的了解,另外我們可以將 Builder 模式引入到自己代碼中,實際操練一下,相信你也會對它 "愛不釋手"

另外,早之前筆者使用線程池都是自己封裝,同時用到了 Builder、模版方法 兩種模式,并且重寫了部分線程池方法,使用以及排查問題都比較順手。


分享標題:如何使用Builder模式構(gòu)建線程池
轉(zhuǎn)載源于:http://www.dlmjj.cn/article/dpseidj.html