中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

線程池源碼解讀的示例分析

發布時間:2021-09-10 11:00:19 來源:億速云 閱讀:115 作者:柒染 欄目:大數據

線程池源碼解讀的示例分析,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

一、execute

ctl作為AtomicInteger類存放了類中的兩種信息,在其中由高3位來保存線程池的狀態,后29位來保存此時線程池中的Woker類線程數量(由此可知,線程池中的線程數量最高可以接受大約在五億左右)。由此可見給出的runStateOf()和workerCountOf()方法分別給出了查看線程狀態和線程數量的方法。

public void execute(Runnable command) {
        if (command == null)
            throw new NullPointerException();
        int c = ctl.get();

        //如果運行的線程數小于corePoolSize,嘗試創建一個新線程(Worker),并執行它的第一個command
        if (workerCountOf(c) < corePoolSize) {
            if (addWorker(command, true))
                return;
            c = ctl.get();
        }
        //線程數大于corePoolSize,將線程放入任務隊列
        //第一次校驗線程池在運行狀態
        if (isRunning(c) && workQueue.offer(command)) {
            int recheck = ctl.get();
            //第二次校驗,防止在第一次校驗通過后線程池關閉。如果線程池關閉,在隊列中刪除task并拒絕task
            if (! isRunning(recheck) && remove(command))
                reject(command);
            //如果線程數=0(線程都死掉了,比如:corePoolSize=0),新建線程且未指定firstTask,僅輪詢任務隊列
            else if (workerCountOf(recheck) == 0)
                addWorker(null, false);
        }
        //任務隊列已滿,嘗試創建新線程執行task,創建失敗后拒絕task
        //創建失敗原因:1.線程池關閉;2.線程數已經達到maxPoolSize
        else if (!addWorker(command, false))
            reject(command);
}
private boolean addWorker(Runnable firstTask, boolean core) {
        retry:
        //外層循環判斷線程池的狀態
        for (;;) {
            int c = ctl.get();
            //線程池狀態
            int rs = runStateOf(c);
            //線程池狀態:RUNNING = -1、SHUTDOWN = 0、STOP = 1、TIDYING = 2、TERMINATED
            if (rs >= SHUTDOWN &&
                ! (rs == SHUTDOWN &&
                   firstTask == null &&
                   ! workQueue.isEmpty()))
                return false;
            //用CAS的方式對線程數量進行+1操作
            for (;;) {
                int wc = workerCountOf(c);
                if (wc >= CAPACITY ||
                    wc >= (core ? corePoolSize : maximumPoolSize))
                    return false;
                if (compareAndIncrementWorkerCount(c))
                    break retry;
                c = ctl.get();  // Re-read ctl
                if (runStateOf(c) != rs)
                    continue retry;
                // else CAS failed due to workerCount change; retry inner loop
            }
        }

        boolean workerStarted = false;
        boolean workerAdded = false;
        Worker w = null;
        try {

            //worker實現了Runable接口
            w = new Worker(firstTask);
            final Thread t = w.thread;
            if (t != null) {
                final ReentrantLock mainLock = this.mainLock;
                mainLock.lock();
                try {
                    // Recheck while holding lock.
                    // Back out on ThreadFactory failure or if
                    // shut down before lock acquired.
                    int rs = runStateOf(ctl.get());

                    if (rs < SHUTDOWN ||
                        (rs == SHUTDOWN && firstTask == null)) {
                        if (t.isAlive()) // precheck that t is startable
                            throw new IllegalThreadStateException();
                    
                        //workers是一個worker數組
                        workers.add(w);
                        int s = workers.size();
                        if (s > largestPoolSize)
                            largestPoolSize = s;
                        workerAdded = true;
                    }
                } finally {
                    mainLock.unlock();
                }
                if (workerAdded) {
                    //啟動線程,執行的就是worker中的run()
                    t.start();
                    workerStarted = true;
                }
            }
        } finally {
            if (! workerStarted)
                addWorkerFailed(w);
        }
        return workerStarted;
    }

Worker類:

private final class Worker
        extends AbstractQueuedSynchronizer
        implements Runnable//Worker是一個線程
    {
        private static final long serialVersionUID = 6138294804551838833L;

        final Thread thread;
        Runnable firstTask;
        volatile long completedTasks;
        Worker(Runnable firstTask) {
            setState(-1); // inhibit interrupts until runWorker
            this.firstTask = firstTask;
            //把當前Worker包裝成一個thread
            this.thread = getThreadFactory().newThread(this);
        }
        public void run() {
            runWorker(this);
        }
}
final void runWorker(Worker w) {
        Thread wt = Thread.currentThread();
        Runnable task = w.firstTask;
        w.firstTask = null;
        w.unlock(); // allow interrupts
        boolean completedAbruptly = true;
        try {
            //如果這個worker還沒有執行過在構造方法就傳入的任務,那么在這個方法中,會直接執行這一任務,如果沒有,則會 
            //嘗試去從任務隊列當中去取的新的任務。
            //在執行完畢后,工作線程的使命并沒有真正宣告段落。在while部分worker仍舊會通過getTask()方法試圖取得新 
            //的任務。下面是getTask()的實現。
            while (task != null || (task = getTask()) != null) {
                w.lock();
                if ((runStateAtLeast(ctl.get(), STOP) ||
                     (Thread.interrupted() &&
                      runStateAtLeast(ctl.get(), STOP))) &&
                    !wt.isInterrupted())
                    wt.interrupt();
                try {
                    beforeExecute(wt, task);
                    Throwable thrown = null;
                    try {
                        task.run();
                    } catch (RuntimeException x) {
                        thrown = x; throw x;
                    } catch (Error x) {
                        thrown = x; throw x;
                    } catch (Throwable x) {
                        thrown = x; throw new Error(x);
                    } finally {
                        afterExecute(task, thrown);
                    }
                } finally {
                    task = null;
                    w.completedTasks++;
                    w.unlock();
                }
            }
            completedAbruptly = false;
        } finally {
            processWorkerExit(w, completedAbruptly);
        }
    }
private Runnable getTask() {
        boolean timedOut = false; // Did the last poll() time out?

        for (;;) {
            int c = ctl.get();
            int rs = runStateOf(c);

            // Check if queue empty only if necessary.
            if (rs >= SHUTDOWN && (rs >= STOP || workQueue.isEmpty())) {
                decrementWorkerCount();
                return null;
            }

            int wc = workerCountOf(c);

            // Are workers subject to culling?
            boolean timed = allowCoreThreadTimeOut || wc > corePoolSize;

            if ((wc > maximumPoolSize || (timed && timedOut))
                && (wc > 1 || workQueue.isEmpty())) {
                if (compareAndDecrementWorkerCount(c))
                    return null;
                continue;
            }

            try {
                //從工作隊列中取出線程
                Runnable r = timed ?
                    workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :
                    workQueue.take();
                if (r != null)
                    return r;
                timedOut = true;
            } catch (InterruptedException retry) {
                timedOut = false;
            }
        }
    }

二、submit

    public Future<?> submit(Runnable task) {
        if (task == null) throw new NullPointerException();
        RunnableFuture<Void> ftask = newTaskFor(task, null);
        execute(ftask);
        return ftask;
    }

    /**
     * @throws RejectedExecutionException {@inheritDoc}
     * @throws NullPointerException       {@inheritDoc}
     */
    public <T> Future<T> submit(Runnable task, T result) {
        if (task == null) throw new NullPointerException();
        RunnableFuture<T> ftask = newTaskFor(task, result);
        execute(ftask);
        return ftask;
    }

    /**
     * @throws RejectedExecutionException {@inheritDoc}
     * @throws NullPointerException       {@inheritDoc}
     */
    public <T> Future<T> submit(Callable<T> task) {
        if (task == null) throw new NullPointerException();
        RunnableFuture<T> ftask = newTaskFor(task);
        execute(ftask);
        return ftask;
    }
    protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {
        return new FutureTask<T>(runnable, value);
    }

    protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) {
        return new FutureTask<T>(callable);
    }

可見,submit將普通的runnable包裝成FutureTask并返回,再調用execute去執行。

關于線程池源碼解讀的示例分析問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

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

AI

安溪县| 泰宁县| 盐池县| 古交市| 静海县| 乐东| 大余县| 平利县| 安多县| 乾安县| 泸西县| 吴桥县| 通化县| 团风县| 凤冈县| 柳林县| 丹东市| 安阳市| 浙江省| 敖汉旗| 伊金霍洛旗| 香港| 隆尧县| 乌拉特前旗| 浦江县| 长阳| 盐边县| 南汇区| 冀州市| 武鸣县| 桐庐县| 灌阳县| 托克托县| 永仁县| 邵武市| 西宁市| 淮安市| 息烽县| 石柱| 肇源县| 沭阳县|