色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

線程池的運轉(zhuǎn)流程圖 池化技術(shù)實踐案例解析

jf_ro2CN3Fa ? 來源:稀土掘金 ? 2023-11-24 10:22 ? 次閱讀

1 一些廢話

作為一名Java開發(fā)人員,池化技術(shù)或多或少在業(yè)務(wù)代碼中使用。常見的包括線程池、連接池等。也是因為Java語言超級豐富的基建,基本上這些池化能力都有著相對成熟的“工具”。

比如,需要使用線程池的時候常常會選擇Spring提供的 ThreadPoolTaskExecutor , 工具內(nèi)部替我們維護了線程的生命周期與任務(wù)的狀態(tài)變化。

線程池的運轉(zhuǎn)流程圖

f9c57a96-8a69-11ee-939d-92fbcf53809c.png

2 正文開始

在筆者的業(yè)務(wù)場景里,java服務(wù)需要通過命令行啟動一個特殊進程,并在進程使用完后將其銷毀。而業(yè)務(wù)對啟動這個進程的整體耗時較為敏感,打算利用池化技術(shù),將進程池化復(fù)用,去除啟動進程的消耗,達到優(yōu)化性能的目標。

f9e0251c-8a69-11ee-939d-92fbcf53809c.png

認識 GenericObjectPool

池化技術(shù)的概念大家可能都比較熟悉了,但真正要從零開始實現(xiàn)池化能力,就會感覺困難很多。好在Java豐富的基建在提供ThreadPoolTaskExecutor的同時,也提供了GenericObjectPool這個輔助我們實現(xiàn)自定義對象池化的工具。順帶提一句:JedisPool就是使用這個工具實現(xiàn)的。

GenericObjectPool構(gòu)造方法一共就3個參數(shù),只有PooledObjectFactory必傳;

/**
*Createsanew{@codeGenericObjectPool}thattracksanddestroys
*objectsthatarecheckedout,butneverreturnedtothepool.
*
*@paramfactoryTheobjectfactorytobeusedtocreateobjectinstances
*usedbythispool
*@paramconfigThebasepoolconfigurationtouseforthispoolinstance.
*Theconfigurationisusedbyvalue.Subsequentchangesto
*theconfigurationobjectwillnotbereflectedinthe
*pool.
*@paramabandonedConfigConfigurationforabandonedobjectidentification
*andremoval.Theconfigurationisusedbyvalue.
*/
publicGenericObjectPool(finalPooledObjectFactoryfactory,
finalGenericObjectPoolConfigconfig,finalAbandonedConfigabandonedConfig){
}

PooledObjectFactory 按照方法注釋的描述,它是專門負責(zé)給池子創(chuàng)建對象實例的。當(dāng)然除了創(chuàng)建對象(makeObject), 還包括了檢驗、激活、銷毀對象。基本涵蓋了對象生命周期中的各個階段。

voidactivateObject(PooledObjectp)throwsException;

voiddestroyObject(PooledObjectp)throwsException;

PooledObjectmakeObject()throwsException;

voidpassivateObject(PooledObjectp)throwsException;

booleanvalidateObject(PooledObjectp);

更加詳細的說明可以瀏覽 GenericObjectPool's apidocs [1]。源碼的注釋也很詳細值得一看。

使用 GenericObjectPool

先引入依賴


org.apache.commons
commons-pool2
${version}

根據(jù)自身業(yè)務(wù)實現(xiàn)PooledObjectFactory接口;作者的業(yè)務(wù)場景是進程池化,那么對應(yīng)的創(chuàng)建對象、銷毀對象的方法就是創(chuàng)建進程和銷毀進程的代碼。

publicclassMyProcessFactoryimplementsPooledObjectFactory{
@Override
publicvoiddestroyObject(PooledObjectp)throwsException{
finalMyProcessprocess=p.getObject();
if(null!=process){
//銷毀進程
process.stop();
}
}

@Override
publicPooledObjectmakeObject()throwsException{
//這里就是去創(chuàng)建一個進程
MyProcessprocess=newMyProcess();
process.start();
returnnewDefaultPooledObject<>(process);
}

//剩下幾個方法也可以按需實現(xiàn)
}

下一步就是構(gòu)建 GenericObjectPool 實例

PooledObjectFactoryfactory=newMyProcessFactory();
GenericObjectPoolpool=newGenericObjectPool(factory);

使用GenericObjectPool

//獲取進程實例
MyProcessprocess=pool.borrowObject();

//歸還實例
pool.returnObject(process);

進階使用 GenericObjectPoolConfig

顧名思義,GenericObjectPoolConfig是池化工具的配置類;它包含了池的最大容量、池的最大空閑數(shù)、最小空閑數(shù)等核心參數(shù)。除此之外在它的父類 BaseObjectPoolConfig 中,空閑對象檢測規(guī)則,對象存放隊列進出規(guī)則(LIFO)等更加細節(jié)的配置。

/**
*Thedefaultvalueforthe{@codemaxTotal}configurationattribute.
*@seeGenericObjectPool#getMaxTotal()
*/
publicstaticfinalintDEFAULT_MAX_TOTAL=8;

/**
*Thedefaultvalueforthe{@codemaxIdle}configurationattribute.
*@seeGenericObjectPool#getMaxIdle()
*/
publicstaticfinalintDEFAULT_MAX_IDLE=8;

/**
*Thedefaultvalueforthe{@codeminIdle}configurationattribute.
*@seeGenericObjectPool#getMinIdle()
*/
publicstaticfinalintDEFAULT_MIN_IDLE=0;

通過調(diào)整這些參數(shù)值,就能創(chuàng)建符合業(yè)務(wù)要求的池子。下面就是能常駐4個進程的一套配置參數(shù)。

privateGenericObjectPoolConfiggenericObjectPoolConfig(){
finalGenericObjectPoolConfigconfig=newGenericObjectPoolConfig<>();
config.setMaxTotal(20);//池的最大容量
config.setMaxIdle(4);//最大空閑連接數(shù)
config.setMinIdle(0);//最小空閑連接數(shù)
config.setMaxWait(Duration.ofSeconds(5));//獲取對象時最大等待時間
config.setTimeBetweenEvictionRuns(Duration.ofMinutes(1));//空閑對象檢查間隔
config.setMinEvictableIdleTime(Duration.ofMinutes(10));//空閑對象被移除的最小空閑時間
config.setTestOnBorrow(true);
config.setLifo(false);
returnconfig;
}

3 后續(xù)

當(dāng)然真實的業(yè)務(wù)中還會有很多不相關(guān)的邏輯夾雜其中,上文基本涵蓋了池化對象搭建與配置的實現(xiàn)方法。最終也實現(xiàn)了性能優(yōu)化的目標。希望此文能為大家在池化運用多些幫助。

審核編輯:黃飛

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2966

    瀏覽量

    104702
  • 編程語言
    +關(guān)注

    關(guān)注

    10

    文章

    1942

    瀏覽量

    34707
  • 線程池
    +關(guān)注

    關(guān)注

    0

    文章

    57

    瀏覽量

    6844

原文標題:池化技術(shù)在真實業(yè)務(wù)中的實踐

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    Java中的線程包括哪些

    線程是用來統(tǒng)一管理線程的,在 Java 中創(chuàng)建和銷毀線程都是一件消耗資源的事情,線程可以重復(fù)
    的頭像 發(fā)表于 10-11 15:33 ?809次閱讀
    Java中的<b class='flag-5'>線程</b><b class='flag-5'>池</b>包括哪些

    動態(tài)線程思想學(xué)習(xí)及實踐

    相關(guān)文檔 美團線程實踐:https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html 線程
    的頭像 發(fā)表于 06-13 15:43 ?1180次閱讀
    動態(tài)<b class='flag-5'>線程</b><b class='flag-5'>池</b>思想學(xué)習(xí)及<b class='flag-5'>實踐</b>

    買藥秒送 JADE動態(tài)線程實踐及原理淺析

    一、背景及JADE介紹 買藥秒送是健康即時零售業(yè)務(wù)新的核心流量場域,面對京東首頁高流量曝光,我們對頻道頁整個技術(shù)架構(gòu)方案進行升級,保障接口高性能、系統(tǒng)高可用。 動態(tài)線程是買藥頻道應(yīng)用的技術(shù)
    的頭像 發(fā)表于 09-04 11:11 ?830次閱讀
    買藥秒送 JADE動態(tài)<b class='flag-5'>線程</b><b class='flag-5'>池</b><b class='flag-5'>實踐</b>及原理淺析

    線程是如何實現(xiàn)的

    線程的概念是什么?線程是如何實現(xiàn)的?
    發(fā)表于 02-28 06:20

    基于線程技術(shù)集群接入點的應(yīng)用研究

    本文在深入研究高級線程技術(shù)的基礎(chǔ)上,分析、研究了固定線程數(shù)目的線程
    發(fā)表于 01-22 14:21 ?5次下載

    基于Nacos的簡單動態(tài)線程實現(xiàn)

    本文以Nacos作為服務(wù)配置中心,以修改線程核心線程數(shù)、最大線程數(shù)為例,實現(xiàn)一個簡單的動態(tài)線程
    發(fā)表于 01-06 14:14 ?862次閱讀

    Spring 的線程應(yīng)用

    我們在日常開發(fā)中,經(jīng)常跟多線程打交道,Spring 為我們提供了一個線程方便我們開發(fā),它就是 ThreadPoolTaskExecutor ,接下來我們就來聊聊 Spring 的線程
    的頭像 發(fā)表于 10-13 10:47 ?620次閱讀
    Spring 的<b class='flag-5'>線程</b><b class='flag-5'>池</b>應(yīng)用

    什么是內(nèi)存

    1什么是內(nèi)存 1.1技術(shù) 所謂“技術(shù)”,就
    的頭像 發(fā)表于 11-08 16:26 ?897次閱讀
    什么是內(nèi)存<b class='flag-5'>池</b>

    了解連接線程、內(nèi)存、異步請求

    技術(shù) 技術(shù)能夠減少資源對象的創(chuàng)建次數(shù),提?程序的響應(yīng)性能,特別是在?并發(fā)下這種提?更加明
    的頭像 發(fā)表于 11-09 14:44 ?1308次閱讀
    了解連接<b class='flag-5'>池</b>、<b class='flag-5'>線程</b><b class='flag-5'>池</b>、內(nèi)存<b class='flag-5'>池</b>、異步請求<b class='flag-5'>池</b>

    線程基本概念與原理

    一、線程基本概念與原理 1.1 線程概念及優(yōu)勢 C++線程簡介
    的頭像 發(fā)表于 11-10 10:24 ?528次閱讀

    線程的基本概念

    線程的基本概念 不管線程是什么東西!但是我們必須知道線程被搞出來的目的就是:提高程序執(zhí)行效
    的頭像 發(fā)表于 11-10 16:37 ?520次閱讀
    <b class='flag-5'>線程</b><b class='flag-5'>池</b>的基本概念

    技術(shù)的應(yīng)用實踐

    作為一名Java開發(fā)人員,技術(shù)或多或少在業(yè)務(wù)代碼中使用。常見的包括線程、連接等。也是因為
    的頭像 發(fā)表于 11-24 10:22 ?512次閱讀
    <b class='flag-5'>池</b><b class='flag-5'>化</b><b class='flag-5'>技術(shù)</b>的應(yīng)用<b class='flag-5'>實踐</b>

    線程七大核心參數(shù)執(zhí)行順序

    線程是一種用于管理和調(diào)度線程執(zhí)行的技術(shù),通過將任務(wù)分配到線程池中的線程進行處理,可以有效地控制
    的頭像 發(fā)表于 12-04 16:45 ?1052次閱讀

    線程的創(chuàng)建方式有幾種

    線程是一種用于管理和調(diào)度線程技術(shù),能夠有效地提高系統(tǒng)的性能和資源利用率。它通過預(yù)先創(chuàng)建一組線程并維護一個工作隊列,將任務(wù)提交給
    的頭像 發(fā)表于 12-04 16:52 ?854次閱讀

    什么是動態(tài)線程?動態(tài)線程的簡單實現(xiàn)思路

    因此,動態(tài)可監(jiān)控線程一種針對以上痛點開發(fā)的線程管理工具。主要可實現(xiàn)功能有:提供對 Spring 應(yīng)用內(nèi)線程
    的頭像 發(fā)表于 02-28 10:42 ?639次閱讀
    主站蜘蛛池模板: 麻豆Av国产在线播放| 国产免费午夜| 天美传媒色情原创精品| 色老99九久精品偷偷鲁| 翁熄性放纵交换01| 亚洲色欲色欲www474ee| 最近免费视频中文2019完整版| 99热热在线精品久久| 成人免费视频在线观看| 国产精品A久久久久久久久| 国产综合在线观看| 老熟女重囗味HDXX| 千禧金瓶梅快播| 午夜性爽视频男人的天堂在线| 亚洲欧洲日韩国产一区二区三区| 手机移动oa| 四虎国产精品高清在线观看| 亚洲AV色香蕉一区二区9255| 这里只有精品网| 插曲的痛30分钟视频最新章节| 国产麻豆精品传媒AV国产在线| 国产成年人在线观看| 精品国产九九| 欧美日韩另类在线观看视频| 午夜国产精品视频在线| 有人有片的观看免费视频| 岳扒开让我添| 宅男午夜大片又黄又爽大片| 成人无码精品一区二区在线观看| 国产在线高清视频无码不卡| 麻豆一二三区果冻| 无码人妻丰满熟妇啪啪网不卡| 中文字幕欧美一区| 国产高清美女一级毛片久久| 久久永久视频| 午夜勾魂曲| chinese极品嫩模videos| xnxx18美女| 精品无码一区二区三区不卡| 热思思| 影音先锋色av男人资源网|