内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

深入淺析Java中線程池的原理

這篇文章將為大家詳細(xì)講解有關(guān)深入淺析Java中線程池的原理,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

成都創(chuàng)新互聯(lián)公司是一家專業(yè)從事成都做網(wǎng)站、網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司。作為專業(yè)網(wǎng)絡(luò)公司,成都創(chuàng)新互聯(lián)公司依托的技術(shù)實力、以及多年的網(wǎng)站運營經(jīng)驗,為您提供專業(yè)的成都網(wǎng)站建設(shè)、全網(wǎng)整合營銷推廣及網(wǎng)站設(shè)計開發(fā)服務(wù)!

ThreadPoolExecutor簡介

ThreadPoolExecutor是線程池類。對于線程池,可以通俗的將它理解為"存放一定數(shù)量線程的一個線程集合。線程池允許若個線程同時允許,允許同時運行的線程數(shù)量就是線程池的容量;當(dāng)添加的到線程池中的線程超過它的容量時,會有一部分線程阻塞等待。線程池會通過相應(yīng)的調(diào)度策略和拒絕策略,對添加到線程池中的線程進(jìn)行管理。" 

ThreadPoolExecutor數(shù)據(jù)結(jié)構(gòu)

ThreadPoolExecutor的數(shù)據(jù)結(jié)構(gòu)如下圖所示:

深入淺析Java中線程池的原理

各個數(shù)據(jù)在ThreadPoolExecutor.java中的定義如下:

// 阻塞隊列。
private final BlockingQueue<Runnable> workQueue;
// 互斥鎖
private final ReentrantLock mainLock = new ReentrantLock();
// 線程集合。一個Worker對應(yīng)一個線程。
private final HashSet<Worker> workers = new HashSet<Worker>();
// “終止條件”,與“mainLock”綁定。
private final Condition termination = mainLock.newCondition();
// 線程池中線程數(shù)量曾經(jīng)達(dá)到過的最大值。
private int largestPoolSize;
// 已完成任務(wù)數(shù)量
private long completedTaskCount;
// ThreadFactory對象,用于創(chuàng)建線程。
private volatile ThreadFactory threadFactory;
// 拒絕策略的處理句柄。
private volatile RejectedExecutionHandler handler;
// 保持線程存活時間。
private volatile long keepAliveTime;

private volatile boolean allowCoreThreadTimeOut;
// 核心池大小
private volatile int corePoolSize;
// 最大池大小
private volatile int maximumPoolSize;
 

1. workers

    workers是HashSet<Work>類型,即它是一個Worker集合。而一個Worker對應(yīng)一個線程,也就是說線程池通過workers包含了"一個線程集合"。當(dāng)Worker對應(yīng)的線程池啟動時,它會執(zhí)行線程池中的任務(wù);當(dāng)執(zhí)行完一個任務(wù)后,它會從線程池的阻塞隊列中取出一個阻塞的任務(wù)來繼續(xù)運行。
    wokers的作用是,線程池通過它實現(xiàn)了"允許多個線程同時運行"。

2. workQueue

    workQueue是BlockingQueue類型,即它是一個阻塞隊列。當(dāng)線程池中的線程數(shù)超過它的容量的時候,線程會進(jìn)入阻塞隊列進(jìn)行阻塞等待。
    通過workQueue,線程池實現(xiàn)了阻塞功能。

3. mainLock

    mainLock是互斥鎖,通過mainLock實現(xiàn)了對線程池的互斥訪問。

4. corePoolSize和maximumPoolSize

    corePoolSize是"核心池大小",maximumPoolSize是"最大池大小"。它們的作用是調(diào)整"線程池中實際運行的線程的數(shù)量"。
    例如,當(dāng)新任務(wù)提交給線程池時(通過execute方法)。
          -- 如果此時,線程池中運行的線程數(shù)量< corePoolSize,則創(chuàng)建新線程來處理請求。
          -- 如果此時,線程池中運行的線程數(shù)量> corePoolSize,但是卻< maximumPoolSize;則僅當(dāng)阻塞隊列滿時才創(chuàng)建新線程。
          如果設(shè)置的 corePoolSize 和 maximumPoolSize 相同,則創(chuàng)建了固定大小的線程池。如果將 maximumPoolSize 設(shè)置為基本的無界值(如 Integer.MAX_VALUE),則允許池適應(yīng)任意數(shù)量的并發(fā)任務(wù)。在大多數(shù)情況下,核心池大小和最大池大小的值是在創(chuàng)建線程池設(shè)置的;但是,也可以使用 setCorePoolSize(int) 和 setMaximumPoolSize(int) 進(jìn)行動態(tài)更改。

5. poolSize

    poolSize是當(dāng)前線程池的實際大小,即線程池中任務(wù)的數(shù)量。

6. allowCoreThreadTimeOut和keepAliveTime

    allowCoreThreadTimeOut表示是否允許"線程在空閑狀態(tài)時,仍然能夠存活";而keepAliveTime是當(dāng)線程池處于空閑狀態(tài)的時候,超過keepAliveTime時間之后,空閑的線程會被終止。

7. threadFactory

    threadFactory是ThreadFactory對象。它是一個線程工廠類,"線程池通過ThreadFactory創(chuàng)建線程"。

8. handler

    handler是RejectedExecutionHandler類型。它是"線程池拒絕策略"的句柄,也就是說"當(dāng)某任務(wù)添加到線程池中,而線程池拒絕該任務(wù)時,線程池會通過handler進(jìn)行相應(yīng)的處理"。

綜上所說,線程池通過workers來管理"線程集合",每個線程在啟動后,會執(zhí)行線程池中的任務(wù);當(dāng)一個任務(wù)執(zhí)行完后,它會從線程池的阻塞隊列中取出任務(wù)來繼續(xù)運行。阻塞隊列是管理線程池任務(wù)的隊列,當(dāng)添加到線程池中的任務(wù)超過線程池的容量時,該任務(wù)就會進(jìn)入阻塞隊列進(jìn)行等待。 

線程池調(diào)度

我們通過下面的圖看看下面線程池中任務(wù)的調(diào)度策略,加深對線程池的理解。

圖-01:

深入淺析Java中線程池的原理

圖-02:

深入淺析Java中線程池的原理

說明:

    在"圖-01"中,線程池中有N個任務(wù)。"任務(wù)1", "任務(wù)2", "任務(wù)3"這3個任務(wù)在執(zhí)行,而"任務(wù)3"到"任務(wù)N"在阻塞隊列中等待。正在執(zhí)行的任務(wù),在workers集合中,workers集合包含3個Worker,每一個Worker對應(yīng)一個Thread線程,Thread線程每次處理一個任務(wù)。
    當(dāng)workers集合中處理完某一個任務(wù)之后,會從阻塞隊列中取出一個任務(wù)來繼續(xù)執(zhí)行,如圖-02所示。圖-02表示"任務(wù)1"處理完畢之后,線程池將"任務(wù)4"從阻塞隊列中取出,放到workers中進(jìn)行處理。

關(guān)于深入淺析Java中線程池的原理就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

網(wǎng)站欄目:深入淺析Java中線程池的原理
本文網(wǎng)址:http://www.rwnh.cn/article6/ghciig.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、網(wǎng)站建設(shè)、網(wǎng)站導(dǎo)航企業(yè)網(wǎng)站制作、網(wǎng)站排名、網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司
翼城县| 巴林右旗| 宝坻区| 垫江县| 永仁县| 巴南区| 土默特左旗| 南岸区| 万州区| 琼海市| 东山县| 洪湖市| 河北省| 唐河县| 巨鹿县| 彭山县| 渑池县| 汪清县| 阜宁县| 邢台县| 蓬安县| 呈贡县| 桑植县| 东海县| 麦盖提县| 肥西县| 绵阳市| 兴化市| 郯城县| 班玛县| 千阳县| 黄冈市| 阿克苏市| 沧源| 和林格尔县| 沽源县| 四川省| 新津县| 增城市| 安陆市| 景泰县|