欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

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

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

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

Java線程池核心原理

OSC開源社區(qū) ? 來源:冰河技術(shù) ? 2023-04-21 10:24 ? 次閱讀

本文的整體結(jié)構(gòu)如下所示。

f7ed04c8-df9c-11ed-bfe3-dac502259ad0.png

Java線程池核心原理

看過Java線程池源碼的小伙伴都知道,在Java線程池中最核心的類就是ThreadPoolExecutor,而在ThreadPoolExecutor類中最核心的構(gòu)造方法就是帶有7個(gè)參數(shù)的構(gòu)造方法,如下所示。

publicThreadPoolExecutor(intcorePoolSize,
intmaximumPoolSize,
longkeepAliveTime,
TimeUnitunit,
BlockingQueueworkQueue,
ThreadFactorythreadFactory,
RejectedExecutionHandlerhandler)

各參數(shù)的含義如下所示。

corePoolSize:線程池中的常駐核心線程數(shù)。

maximumPoolSize:線程池能夠容納同時(shí)執(zhí)行的最大線程數(shù),此值大于等于1。

keepAliveTime:多余的空閑線程存活時(shí)間,當(dāng)空間時(shí)間達(dá)到keepAliveTime值時(shí),多余的線程會被銷毀直到只剩下corePoolSize個(gè)線程為止。

unit:keepAliveTime的單位。

workQueue:任務(wù)隊(duì)列,被提交但尚未被執(zhí)行的任務(wù)。

threadFactory:表示生成線程池中工作線程的線程工廠,用戶創(chuàng)建新線程,一般用默認(rèn)即可。

handler:拒絕策略,表示當(dāng)線程隊(duì)列滿了并且工作線程大于等于線程池的最大顯示數(shù)(maxnumPoolSize)時(shí),如何來拒絕請求執(zhí)行的runnable的策略。

并且Java的線程池是通過 生產(chǎn)者-消費(fèi)者模式 實(shí)現(xiàn)的,線程池的使用方是生產(chǎn)者,而線程池本身就是消費(fèi)者。

Java線程池的核心工作流程如下圖所示。

f8050b90-df9c-11ed-bfe3-dac502259ad0.png

手?jǐn)]Java線程池

我們自己手動實(shí)現(xiàn)的線程池要比Java自身的線程池簡單的多,我們?nèi)サ袅烁鞣N復(fù)雜的處理方式,只保留了最核心的原理:線程池的使用者向任務(wù)隊(duì)列中添加任務(wù),而線程池本身從任務(wù)隊(duì)列中消費(fèi)任務(wù)并執(zhí)行任務(wù)。

f812d59a-df9c-11ed-bfe3-dac502259ad0.png

只要理解了這個(gè)核心原理,接下來的代碼就簡單多了。在實(shí)現(xiàn)這個(gè)簡單的線程池時(shí),我們可以將整個(gè)實(shí)現(xiàn)過程進(jìn)行拆解。拆解后的實(shí)現(xiàn)流程為:定義核心字段、創(chuàng)建內(nèi)部類WorkThread、創(chuàng)建ThreadPool類的構(gòu)造方法和創(chuàng)建執(zhí)行任務(wù)的方法。

f81fd010-df9c-11ed-bfe3-dac502259ad0.png

定義核心字段

首先,我們創(chuàng)建一個(gè)名稱為ThreadPool的Java類,并在這個(gè)類中定義如下核心字段。

DEFAULT_WORKQUEUE_SIZE:靜態(tài)常量,表示默認(rèn)的阻塞隊(duì)列大小。

workQueue:模擬實(shí)際的線程池使用阻塞隊(duì)列來實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者模式。

workThreads:模擬實(shí)際的線程池使用List集合保存線程池內(nèi)部的工作線程。

核心代碼如下所示。

//默認(rèn)阻塞隊(duì)列大小
privatestaticfinalintDEFAULT_WORKQUEUE_SIZE=5;

//模擬實(shí)際的線程池使用阻塞隊(duì)列來實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者模式
privateBlockingQueueworkQueue;

//模擬實(shí)際的線程池使用List集合保存線程池內(nèi)部的工作線程
privateListworkThreads=newArrayList();

創(chuàng)建內(nèi)部類WordThread

在ThreadPool類中創(chuàng)建一個(gè)內(nèi)部類WorkThread,模擬線程池中的工作線程。主要的作用就是消費(fèi)workQueue中的任務(wù),并執(zhí)行任務(wù)。由于工作線程需要不斷從workQueue中獲取任務(wù),所以,這里使用了while(true)循環(huán)不斷嘗試消費(fèi)隊(duì)列中的任務(wù)。

核心代碼如下所示。

//內(nèi)部類WorkThread,模擬線程池中的工作線程
//主要的作用就是消費(fèi)workQueue中的任務(wù),并執(zhí)行
//由于工作線程需要不斷從workQueue中獲取任務(wù),使用了while(true)循環(huán)不斷嘗試消費(fèi)隊(duì)列中的任務(wù)
classWorkThreadextendsThread{
@Override
publicvoidrun(){
//不斷循環(huán)獲取隊(duì)列中的任務(wù)
while(true){
//當(dāng)沒有任務(wù)時(shí),會阻塞
try{
RunnableworkTask=workQueue.take();
workTask.run();
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
}

創(chuàng)建ThreadPool類的構(gòu)造方法

這里,我們?yōu)門hreadPool類創(chuàng)建兩個(gè)構(gòu)造方法,一個(gè)構(gòu)造方法中傳入線程池的容量大小和阻塞隊(duì)列,另一個(gè)構(gòu)造方法中只傳入線程池的容量大小。

核心代碼如下所示。

//在ThreadPool的構(gòu)造方法中傳入線程池的大小和阻塞隊(duì)列
publicThreadPool(intpoolSize,BlockingQueueworkQueue){
this.workQueue=workQueue;
//創(chuàng)建poolSize個(gè)工作線程并將其加入到workThreads集合中
IntStream.range(0,poolSize).forEach((i)->{
WorkThreadworkThread=newWorkThread();
workThread.start();
workThreads.add(workThread);
});
}

//在ThreadPool的構(gòu)造方法中傳入線程池的大小
publicThreadPool(intpoolSize){
this(poolSize,newLinkedBlockingQueue<>(DEFAULT_WORKQUEUE_SIZE));
}

創(chuàng)建執(zhí)行任務(wù)的方法

在ThreadPool類中創(chuàng)建執(zhí)行任務(wù)的方法execute(),execute()方法的實(shí)現(xiàn)比較簡單,就是將方法接收到的Runnable任務(wù)加入到workQueue隊(duì)列中。

核心代碼如下所示。

//通過線程池執(zhí)行任務(wù)
publicvoidexecute(Runnabletask){
try{
workQueue.put(task);
}catch(InterruptedExceptione){
e.printStackTrace();
}
}

完整源碼

這里,我們給出手動實(shí)現(xiàn)的ThreadPool線程池的完整源代碼,如下所示。

packageio.binghe.thread.pool;

importjava.util.ArrayList;
importjava.util.List;
importjava.util.concurrent.BlockingQueue;
importjava.util.concurrent.LinkedBlockingQueue;
importjava.util.stream.IntStream;

/**
*@authorbinghe
*@version1.0.0
*@description自定義線程池
*/
publicclassThreadPool{

//默認(rèn)阻塞隊(duì)列大小
privatestaticfinalintDEFAULT_WORKQUEUE_SIZE=5;

//模擬實(shí)際的線程池使用阻塞隊(duì)列來實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者模式
privateBlockingQueueworkQueue;

//模擬實(shí)際的線程池使用List集合保存線程池內(nèi)部的工作線程
privateListworkThreads=newArrayList();

//在ThreadPool的構(gòu)造方法中傳入線程池的大小和阻塞隊(duì)列
publicThreadPool(intpoolSize,BlockingQueueworkQueue){
this.workQueue=workQueue;
//創(chuàng)建poolSize個(gè)工作線程并將其加入到workThreads集合中
IntStream.range(0,poolSize).forEach((i)->{
WorkThreadworkThread=newWorkThread();
workThread.start();
workThreads.add(workThread);
});
}

//在ThreadPool的構(gòu)造方法中傳入線程池的大小
publicThreadPool(intpoolSize){
this(poolSize,newLinkedBlockingQueue<>(DEFAULT_WORKQUEUE_SIZE));
}

//通過線程池執(zhí)行任務(wù)
publicvoidexecute(Runnabletask){
try{
workQueue.put(task);
}catch(InterruptedExceptione){
e.printStackTrace();
}
}

//內(nèi)部類WorkThread,模擬線程池中的工作線程
//主要的作用就是消費(fèi)workQueue中的任務(wù),并執(zhí)行
//由于工作線程需要不斷從workQueue中獲取任務(wù),使用了while(true)循環(huán)不斷嘗試消費(fèi)隊(duì)列中的任務(wù)
classWorkThreadextendsThread{
@Override
publicvoidrun(){
//不斷循環(huán)獲取隊(duì)列中的任務(wù)
while(true){
//當(dāng)沒有任務(wù)時(shí),會阻塞
try{
RunnableworkTask=workQueue.take();
workTask.run();
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
}
}

沒錯(cuò),我們僅僅用了幾十行Java代碼就實(shí)現(xiàn)了一個(gè)極簡版的Java線程池,沒錯(cuò),這個(gè)極簡版的Java線程池的代碼卻體現(xiàn)了Java線程池的核心原理。

接下來,我們測試下這個(gè)極簡版的Java線程池。

編寫測試程序

測試程序也比較簡單,就是通過在main()方法中調(diào)用ThreadPool類的構(gòu)造方法,傳入線程池的大小,創(chuàng)建一個(gè)ThreadPool類的實(shí)例,然后循環(huán)10次調(diào)用ThreadPool類的execute()方法,向線程池中提交的任務(wù)為:打印當(dāng)前線程的名稱--->> Hello ThreadPool。

整體測試代碼如下所示。

packageio.binghe.thread.pool.test;

importio.binghe.thread.pool.ThreadPool;

importjava.util.stream.IntStream;

/**
*@authorbinghe
*@version1.0.0
*@description測試自定義線程池
*/
publicclassThreadPoolTest{

publicstaticvoidmain(String[]args){
ThreadPoolthreadPool=newThreadPool(10);
IntStream.range(0,10).forEach((i)->{
threadPool.execute(()->{
System.out.println(Thread.currentThread().getName()+"--->>HelloThreadPool");
});
});
}
}

接下來,運(yùn)行ThreadPoolTest類的main()方法,會輸出如下信息。

Thread-0--->>HelloThreadPool
Thread-9--->>HelloThreadPool
Thread-5--->>HelloThreadPool
Thread-8--->>HelloThreadPool
Thread-4--->>HelloThreadPool
Thread-1--->>HelloThreadPool
Thread-2--->>HelloThreadPool
Thread-5--->>HelloThreadPool
Thread-9--->>HelloThreadPool
Thread-0--->>HelloThreadPool

至此,我們自定義的Java線程池就開發(fā)完成了。

總結(jié)

線程池的核心原理其實(shí)并不復(fù)雜,只要我們耐心的分析,深入其源碼理解線程池的核心本質(zhì),你就會發(fā)現(xiàn)線程池的設(shè)計(jì)原來是如此的優(yōu)雅。希望通過這個(gè)手寫線程池的小例子,能夠讓你更好的理解線程池的核心原理。





審核編輯:劉清

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

    關(guān)注

    19

    文章

    2975

    瀏覽量

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

    關(guān)注

    0

    文章

    57

    瀏覽量

    6895

原文標(biāo)題:10分鐘帶你徒手做個(gè)Java線程池

文章出處:【微信號:OSC開源社區(qū),微信公眾號:OSC開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    Java 23功能介紹

    Java 23 包含全新和更新的 Java 語言功能、核心 API 以及 JVM,同時(shí)適合新的 Java 開發(fā)者和高級開發(fā)者。從?IntelliJ IDEA 2024.2?開始已支持
    的頭像 發(fā)表于 12-04 10:02 ?373次閱讀
    <b class='flag-5'>Java</b> 23功能介紹

    怎么在JAVA中確定線性大小

    JAVA中確定線性大小,分別介紹CPU密集型任務(wù)和I/O密集型任務(wù)及其處理方法。
    的頭像 發(fā)表于 10-24 14:02 ?237次閱讀

    Python中多線程和多進(jìn)程的區(qū)別

    Python作為一種高級編程語言,提供了多種并發(fā)編程的方式,其中多線程與多進(jìn)程是最常見的兩種方式之一。在本文中,我們將探討Python中多線程與多進(jìn)程的概念、區(qū)別以及如何使用線程與進(jìn)
    的頭像 發(fā)表于 10-23 11:48 ?500次閱讀
    Python中多<b class='flag-5'>線程</b>和多進(jìn)程的區(qū)別

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

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

    CPU線程和程序線程的區(qū)別

    CPU的線程與程序的線程在概念、作用、實(shí)現(xiàn)方式以及性能影響等方面存在顯著差異。以下是對兩者區(qū)別的詳細(xì)闡述,旨在深入探討這一技術(shù)話題。
    的頭像 發(fā)表于 09-02 11:18 ?1244次閱讀

    華納云:java web和java有什么區(qū)別java web和java有什么區(qū)別

    Java Web和Java是兩個(gè)不同的概念,它們在功能、用途和實(shí)現(xiàn)方式上存在一些區(qū)別,下面將詳細(xì)介紹它們之間的區(qū)別。 1. 功能和用途: – Java是一種編程語言,它提供了一種用于開發(fā)各種應(yīng)用程序
    的頭像 發(fā)表于 07-16 13:35 ?918次閱讀
    華納云:<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么區(qū)別<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么區(qū)別

    從多線程設(shè)計(jì)模式到對 CompletableFuture 的應(yīng)用

    最近在開發(fā) 延保服務(wù) 頻道頁時(shí),為了提高查詢效率,使用到了多線程技術(shù)。為了對多線程方案設(shè)計(jì)有更加充分的了解,在業(yè)余時(shí)間讀完了《圖解 Java線程設(shè)計(jì)模式》這本書,覺得收獲良多。本篇
    的頭像 發(fā)表于 06-26 14:18 ?439次閱讀
    從多<b class='flag-5'>線程</b>設(shè)計(jì)模式到對 CompletableFuture 的應(yīng)用

    探索虛擬線程:原理與實(shí)現(xiàn)

    虛擬線程的引入與優(yōu)勢 在Loom項(xiàng)目之前,Java虛擬機(jī)(JVM)中的線程是通過java.lang.Thread類型來實(shí)現(xiàn)的,這些線程被稱為
    的頭像 發(fā)表于 06-24 11:35 ?368次閱讀
    探索虛擬<b class='flag-5'>線程</b>:原理與實(shí)現(xiàn)

    鴻蒙開發(fā):【線程模型】

    管理其他線程的ArkTS引擎實(shí)例,例如使用TaskPool(任務(wù))創(chuàng)建任務(wù)或取消任務(wù)、啟動和終止Worker線程。
    的頭像 發(fā)表于 06-13 16:38 ?461次閱讀
    鴻蒙開發(fā):【<b class='flag-5'>線程</b>模型】

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

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

    OpenHarmony語言基礎(chǔ)類庫【@ohos.taskpool(啟動任務(wù))】

    任務(wù)(taskpool)作用是為應(yīng)用程序提供一個(gè)多線程的運(yùn)行環(huán)境,降低整體資源的消耗、提高系統(tǒng)的整體性能,且您無需關(guān)心線程實(shí)例的生命周期。您可以使用任務(wù)API創(chuàng)建后臺任務(wù)(Task
    的頭像 發(fā)表于 04-24 17:45 ?403次閱讀
    OpenHarmony語言基礎(chǔ)類庫【@ohos.taskpool(啟動任務(wù)<b class='flag-5'>池</b>)】

    鴻蒙APP開發(fā):【ArkTS類庫多線程】TaskPool和Worker的對比

    TaskPool(任務(wù))和Worker的作用是為應(yīng)用程序提供一個(gè)多線程的運(yùn)行環(huán)境,用于處理耗時(shí)的計(jì)算任務(wù)或其他密集型任務(wù)??梢杂行У乇苊膺@些任務(wù)阻塞主線程,從而最大化系統(tǒng)的利用率,降低整體資源消耗,并提高系統(tǒng)的整體性能。
    的頭像 發(fā)表于 03-26 22:09 ?719次閱讀
    鴻蒙APP開發(fā):【ArkTS類庫多<b class='flag-5'>線程</b>】TaskPool和Worker的對比

    ethernetif_input和tcpip協(xié)議棧線程的作用

    tcpip協(xié)議棧線程是lwIP協(xié)議棧的核心線程,負(fù)責(zé)處理TCP/IP協(xié)議棧的各種功能,包括TCP連接管理、IP數(shù)據(jù)報(bào)的路由和轉(zhuǎn)發(fā)、以及UDP數(shù)據(jù)包的處理等。
    的頭像 發(fā)表于 03-20 10:01 ?1487次閱讀

    java實(shí)現(xiàn)多線程的幾種方式

    了多種實(shí)現(xiàn)多線程的方式,本文將詳細(xì)介紹以下幾種方式: 1.繼承Thread類 2.實(shí)現(xiàn)Runnable接口 3.Callable和Future 4.線程 5.Java 8中
    的頭像 發(fā)表于 03-14 16:55 ?789次閱讀

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

    因此,動態(tài)可監(jiān)控線程一種針對以上痛點(diǎn)開發(fā)的線程管理工具。主要可實(shí)現(xiàn)功能有:提供對 Spring 應(yīng)用內(nèi)線程
    的頭像 發(fā)表于 02-28 10:42 ?725次閱讀