成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Java中線程池的內(nèi)部原理分析-創(chuàng)新互聯(lián)

這篇文章將為大家詳細講解有關(guān)Java中線程池的內(nèi)部原理分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

目前成都創(chuàng)新互聯(lián)已為近千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、網(wǎng)站托管運營、企業(yè)網(wǎng)站設(shè)計、臥龍網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

先看一下ThreadPoolExecutor類的execute方法:

public void execute(Runnable command) {
    if (command == null)
        throw new NullPointerException();
    //獲取clt,clt記錄著線程池狀態(tài)和運行線程數(shù)。
    int c = ctl.get();
    //運行線程數(shù)小于核心線程數(shù)時,創(chuàng)建線程放入線程池中,并且運行當前任務(wù)。
    if (workerCountOf(c) < corePoolSize) {
        if (addWorker(command, true))
            return;
        //創(chuàng)建線程失敗,重新獲取clt。
        c = ctl.get();
    }
    //線程池是運行狀態(tài)并且運行線程大于核心線程數(shù)時,把任務(wù)放入隊列中。
    if (isRunning(c) && workQueue.offer(command)) {
        int recheck = ctl.get();
        //重新檢查線程池不是運行狀態(tài)時,
        //把任務(wù)移除隊列,并通過拒絕策略對該任務(wù)進行處理。
        if (! isRunning(recheck) && remove(command))
            reject(command);
        //當前運行線程數(shù)為0時,創(chuàng)建線程加入線程池中。
        else if (workerCountOf(recheck) == 0)
            addWorker(null, false);
    }
    //運行線程大于核心線程數(shù)時并且隊列已滿時,
    //創(chuàng)建線程放入線程池中,并且運行當前任務(wù)。
    else if (!addWorker(command, false))
        //運行線程大于大線程數(shù)時,失敗則拒絕該任務(wù)
        reject(command);
}

在execute方法中,多次調(diào)用的addWorker方法,再看一下這個方法:

private boolean addWorker(Runnable firstTask, boolean core) {
    retry:
    for (;;) {
        //獲取clt,clt記錄著線程池狀態(tài)和運行線程數(shù)。
        int c = ctl.get();
        //獲取線程池的運行狀態(tài)。
        int rs = runStateOf(c);

        //線程池處于關(guān)閉狀態(tài),或者當前任務(wù)為null
        //或者隊列不為空,則直接返回失敗。
        if (rs >= SHUTDOWN &&
            ! (rs == SHUTDOWN &&
               firstTask == null &&
               ! workQueue.isEmpty()))
            return false;

        for (;;) {
            //獲取線程池中的線程數(shù)
            int wc = workerCountOf(c);
            //線程數(shù)超過CAPACITY,則返回false;
            //這里的core是addWorker方法的第二個參數(shù),
            //如果為true則根據(jù)核心線程數(shù)進行比較,
            //如果為false則根據(jù)大線程數(shù)進行比較。
            if (wc >= CAPACITY ||
                wc >= (core ? corePoolSize : maximumPoolSize))
                return false;
            //嘗試增加線程數(shù),如果成功,則跳出第一個for循環(huán)
            if (compareAndIncrementWorkerCount(c))
                break retry;
            //如果增加線程數(shù)失敗,則重新獲取ctl
            c = ctl.get();
            //如果當前的運行狀態(tài)不等于rs,說明狀態(tài)已被改變,
            //返回第一個for循環(huán)繼續(xù)執(zhí)行
            if (runStateOf(c) != rs)
                continue retry;
        }
    }

    boolean workerStarted = false;
    boolean workerAdded = false;
    Worker w = null;
    try {
        //根據(jù)當前任務(wù)來創(chuàng)建Worker對象
        w = new Worker(firstTask);
        final Thread t = w.thread;
        if (t != null) {
            final ReentrantLock mainLock = this.mainLock;
            mainLock.lock();
            try {
                //獲得鎖以后,重新檢查線程池狀態(tài)
                int rs = runStateOf(ctl.get());

                if (rs < SHUTDOWN ||
                    (rs == SHUTDOWN && firstTask == null)) {
                    if (t.isAlive())
                        throw new IllegalThreadStateException();
                    //把剛剛創(chuàng)建的線程加入到線程池中
                    workers.add(w);
                    int s = workers.size();
                    //記錄線程池中出現(xiàn)過的大線程數(shù)量
                    if (s > largestPoolSize)
                        largestPoolSize = s;
                    workerAdded = true;
                }
            } finally {
                mainLock.unlock();
            }
            if (workerAdded) {
                //啟動線程,開始運行任務(wù)
                t.start();
                workerStarted = true;
            }
        }
    } finally {
        if (! workerStarted)
            addWorkerFailed(w);
    }
    return workerStarted;
}

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

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

分享題目:Java中線程池的內(nèi)部原理分析-創(chuàng)新互聯(lián)
標題來源:http://jinyejixie.com/article28/csdjcp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、Google、關(guān)鍵詞優(yōu)化、全網(wǎng)營銷推廣、營銷型網(wǎng)站建設(shè)、網(wǎng)站排名

廣告

聲明:本網(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)

外貿(mào)網(wǎng)站建設(shè)
洛川县| 黎川县| 南部县| 永登县| 广昌县| 保山市| 乐都县| 轮台县| 敦煌市| 兴仁县| 鄂州市| 雷州市| 梅州市| 霍林郭勒市| 宜章县| 宜兴市| 吐鲁番市| 本溪| 黄龙县| 江油市| 通化市| 仲巴县| 满洲里市| 巴马| 江西省| 元江| 汪清县| 元谋县| 汝南县| 师宗县| 弋阳县| 溆浦县| 布拖县| 平安县| 清苑县| 德安县| 枣阳市| 周宁县| 望江县| 双城市| 吉林省|