亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中線程池的內部原理分析

發布時間:2021-11-24 09:28:08 來源:億速云 閱讀:132 作者:小新 欄目:編程語言

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

先看一下ThreadPoolExecutor類的execute方法:

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

在execute方法中,多次調用的addWorker方法,再看一下這個方法:

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

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

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

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

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

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

长沙市| 富蕴县| 西城区| 辛集市| 阿拉善盟| 普定县| 淮南市| 湟中县| 临海市| 石林| 梅河口市| 水富县| 汽车| 武邑县| 兴化市| 兴义市| 平昌县| 和田市| 唐山市| 肃宁县| 都安| 定结县| 赫章县| 西林县| 仙游县| 和龙市| 会昌县| 东辽县| 两当县| 太康县| 邢台县| 罗定市| 卢湾区| 仁寿县| 任丘市| 来凤县| 东港市| 西林县| 子长县| 镇沅| 杭锦后旗|