<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 牛人業(yè)話(huà) > 看了線(xiàn)程和線(xiàn)程池的對比,才知道池化技術(shù)到底有多牛

看了線(xiàn)程和線(xiàn)程池的對比,才知道池化技術(shù)到底有多牛

作者: 時(shí)間:2020-07-30 來(lái)源:Java架構師阿谷 收藏

情商高的人是能洞察并照顧到身邊所有人的情緒,而好的文章應該是讓所有人都能看懂。

本文引用地址:http://dyxdggzs.com/article/202007/416423.htm

尼采曾經(jīng)說(shuō)過(guò):人們無(wú)法理解他沒(méi)有經(jīng)歷過(guò)的事情。因此我會(huì )試著(zhù)把技術(shù)文章寫(xiě)的盡量具象化一些,力求讓所有人都能看懂,所以在正式開(kāi)始之前,我們先從兩個(gè)生活事例說(shuō)起。

生活案例 1

早些年間,某寶雙“11”突然爆火,然后無(wú)數個(gè)男男女女瘋狂“剁手”,然而最痛苦的并不是“剁手”之后吃“灰”的日子,而是漫長(cháng)而又揪心的等待快遞小哥的日子。

嚇我一跳?看了線(xiàn)程和線(xiàn)程池的對比,才知道池化技術(shù)到底有多牛

為了緩解彼此的“痛苦”(快遞公司的電話(huà)被打爆,用戶(hù)等得不耐煩),快遞公司后面就變“聰明”了,每當購物節將要來(lái)臨之前,快遞公司會(huì )預先準備好充足的人和車(chē),以迎接撲面而來(lái)的訂單。

至此,當我們再遇到各種購物節,就再也不用每天盯著(zhù)手機煎熬的等待快遞小哥了。

生活案例 2

小美是一家公司的 HR,每年年初是小美最頭疼的日子了。因為年初有大量的員工離職,因此小美需要一邊辦理離職員工的手續,一邊瘋狂的招人,除了這些工作之外,小美還要忍受來(lái)自各部門(mén)和大 BOSS 的間歇性催促,這些都讓小美痛苦不已。

于是為了應對每年年初的這種囧境,小美也變聰明了,她每年年末的時(shí)候都會(huì )預先招聘一些員工,以備來(lái)年的不時(shí)之需。

自從用了這招之后(提前招人),小美從此過(guò)上了幸福的生活。

嚇我一跳?看了線(xiàn)程和線(xiàn)程池的對比,才知道池化技術(shù)到底有多牛

概念

池化技術(shù)指的是提前準備一些資源,在需要時(shí)可以重復使用這些預先準備的資源。

也就是說(shuō)池化技術(shù)有兩個(gè)優(yōu)點(diǎn):

  1. 提前創(chuàng )建;

  2. 重復利用。

池化技術(shù)優(yōu)點(diǎn)分析

以 Java 中的對象創(chuàng )建來(lái)說(shuō),在對象創(chuàng )建時(shí)要經(jīng)歷以下步驟:

  1. 根據 new 標識符后面的參數,在常量池查找類(lèi)的符號引用;

  2. 如果沒(méi)找到符號應用(類(lèi)并未加載),進(jìn)行類(lèi)的加載、解析、初始化等;

  3. 虛擬機為對象在堆中分配內存,并將分配的內存初始化為 0,針對對象頭,建立相應的描述結構(耗時(shí)操作:需要查找堆中的空閑區域,修改內存分配狀態(tài)等);

  4. 調用對象的初始化方法(耗時(shí)操作:用戶(hù)的復雜的邏輯驗證等操作,如IO、數值計算是否符合規定等)。

從上述的流程中可以看出,創(chuàng )建一個(gè)類(lèi)需要經(jīng)歷復雜且耗時(shí)的操作,因此我們應該盡量復用已有的類(lèi),以確保程序的高效運行,當然如果能夠提前創(chuàng )建這些類(lèi)就再好不過(guò)了,而這些功能都可以用池化技術(shù)來(lái)實(shí)現。

池化技術(shù)常見(jiàn)應用

常見(jiàn)的池化技術(shù)的使用有:線(xiàn)程池、內存池、數據庫連接池、HttpClient 連接池等,下面分別來(lái)看。

1.線(xiàn)程池

線(xiàn)程池的原理很簡(jiǎn)單,類(lèi)似于操作系統中的緩沖區的概念。線(xiàn)程池中會(huì )先啟動(dòng)若干數量的線(xiàn)程,這些線(xiàn)程都處于睡眠狀態(tài)。當客戶(hù)端有一個(gè)新的請求時(shí),就會(huì )喚醒線(xiàn)程池中的某一個(gè)睡眠的線(xiàn)程,讓它來(lái)處理客戶(hù)端的這個(gè)請求,當處理完這個(gè)請求之后,線(xiàn)程又處于睡眠的狀態(tài)。

線(xiàn)程池能很高地提升程序的性能。比如有一個(gè)省級數據大集中的銀行網(wǎng)絡(luò )中心,高峰期每秒的客戶(hù)端請求并發(fā)數超過(guò)100,如果為每個(gè)客戶(hù)端請求創(chuàng )建一個(gè)新的線(xiàn)程的話(huà),那耗費的 CPU 時(shí)間和內存都是十分驚人的,如果采用一個(gè)擁有 200 個(gè)線(xiàn)程的線(xiàn)程池,那將會(huì )節約大量的系統資源,使得更多的 CPU 時(shí)間和內存用來(lái)處理實(shí)際的商業(yè)應用,而不是頻繁的線(xiàn)程創(chuàng )建和銷(xiāo)毀。

<img src="http://editerupload.eepw.com.cn/202007/0b32d9c1148744409e9623b34f69c2c3.數據庫連接池

數據庫連接池的基本思想是在系統初始化的時(shí)候將數據庫連接作為對象存儲在內存中,當用戶(hù)需要訪(fǎng)問(wèn)數據庫的時(shí)候,并非建立一個(gè)新的連接,而是從連接池中取出一個(gè)已建立的空閑連接對象。在使用完畢后,用戶(hù)也不是將連接關(guān)閉,而是將連接放回到連接池中,以供下一個(gè)請求訪(fǎng)問(wèn)使用,而這些連接的建立、斷開(kāi)都是由連接池自身來(lái)管理的。

同時(shí),還可以設置連接池的參數來(lái)控制連接池中的初始連接數、連接的上下限數和每個(gè)連接的最大使用次數、最大空閑時(shí)間等。當然,也可以通過(guò)連接池自身的管理機制來(lái)監視連接的數量、使用情況等。

嚇我一跳?看了線(xiàn)程和線(xiàn)程池的對比,才知道池化技術(shù)到底有多牛

4.HttpClient 連接池

HttpClient 我們經(jīng)常用來(lái)進(jìn)行 HTTP 服務(wù)訪(fǎng)問(wèn)。我們的項目中會(huì )有一個(gè)獲取任務(wù)執行狀態(tài)的功能使用 HttpClient,一秒鐘請求一次,經(jīng)常會(huì )出現 Conection Reset 異常。經(jīng)過(guò)分析發(fā)現,問(wèn)題是出在 HttpClient 的每次請求都會(huì )新建一個(gè)連接,當創(chuàng )建連接的頻率比關(guān)閉連接的頻率大的時(shí)候,就會(huì )導致系統中產(chǎn)生大量處于 TIME_CLOSED 狀態(tài)的連接,這個(gè)時(shí)候使用連接池復用連接就能解決這個(gè)問(wèn)題。

實(shí)戰:線(xiàn)程 VS 線(xiàn)程池

本文我們使用之前文章介紹的統計方法《6種快速統計代碼執行時(shí)間的方法,真香!(史上最全)》,來(lái)測試一下線(xiàn)程和線(xiàn)程池執行的時(shí)間差距有多大,測試代碼如下:

import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
* 線(xiàn)程池 vs 線(xiàn)程 性能對比
*/
public class ThreadPoolPerformance {
// 最大執行次數
   public static final int maxCount = 1000;

   public static void main(String[] args) throws InterruptedException {
       // 線(xiàn)程測試代碼
       ThreadPerformanceTest();

       // 線(xiàn)程池測試代碼
       ThreadPoolPerformanceTest();
   }

   /**
    * 線(xiàn)程池性能測試
    */
   private static void ThreadPoolPerformanceTest() throws InterruptedException {
       // 開(kāi)始時(shí)間
       long stime = System.currentTimeMillis();
       // 業(yè)務(wù)代碼
       ThreadPoolExecutor tp = new ThreadPoolExecutor(10, 10, 0,
               TimeUnit.SECONDS, new LinkedBlockingDeque<>());
       for (int i = 0; i < maxCount; i++) {
           tp.execute(new PerformanceRunnable());
       }
       tp.shutdown();
       tp.awaitTermination(1, TimeUnit.SECONDS);  // 等待線(xiàn)程池執行完成
       // 結束時(shí)間
       long etime = System.currentTimeMillis();
       // 計算執行時(shí)間
       System.out.printf("線(xiàn)程池執行時(shí)長(cháng):%d 毫秒.", (etime - stime));
       System.out.println();
   }

   /**
    * 線(xiàn)程性能測試
    */
   private static void ThreadPerformanceTest() {
       // 開(kāi)始時(shí)間
       long stime = System.currentTimeMillis();
       // 執行業(yè)務(wù)代碼
       for (int i = 0; i < maxCount; i++) {
           Thread td = new Thread(new PerformanceRunnable());
           td.start();
           try {
               td.join(); // 確保線(xiàn)程執行完成
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
       }
       // 結束時(shí)間
       long etime = System.currentTimeMillis();
       // 計算執行時(shí)間
       System.out.printf("線(xiàn)程執行時(shí)長(cháng):%d 毫秒.", (etime - stime));
       System.out.println();
   }

// 業(yè)務(wù)執行類(lèi)
   static class PerformanceRunnable implements Runnable {
       @Override
       public void run() {
           for (int i = 0; i < maxCount; i++) {
               long num = i * i + i;
           }
       }
   }
}
總結

從線(xiàn)程和線(xiàn)程池的測試結果來(lái)看,當我們使用池化技術(shù)時(shí),程序的性能可以提升 10 倍。此測試結果并不代表池化技術(shù)的性能量化結果,因為測試結果受執行方法和循環(huán)次數的影響,但巨大的性能差異足以說(shuō)明池化技術(shù)的優(yōu)勢所在。

無(wú)獨有偶,阿里巴巴的《Java開(kāi)發(fā)手冊》中也強制規定「線(xiàn)程資源必須通過(guò)線(xiàn)程池提供,不允許在應用中自行顯式創(chuàng )建線(xiàn)程」規定如下:

嚇我一跳?看了線(xiàn)程和線(xiàn)程池的對比,才知道池化技術(shù)到底有多牛

因此掌握并使用池化技術(shù)是一個(gè)合格程序員的標配,你還知道哪些常用的池化技術(shù)嗎?歡迎評論區留言補充。




關(guān)鍵詞:

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>