java線程池ThreadPoolExector源碼分析


      java線程池ThreadPoolExector源碼分析


 

今天研究了下ThreadPoolExector源碼,大致上總結了以下幾點跟大家分享下:

一、ThreadPoolExector幾個主要變量

先了解下ThreadPoolExector中比較重要的幾個變量。

             corePoolSize:核心線程數量

       maximumPoolSize:最大線程數量

 allowCoreThreadTimeOut:是否允許線程超時(設置為true時與keepAliveTime,TimeUnit一起起作用)

                keepAliveTime:線程存活時間(當線程池允許線程超時且運行中的線程數量超過corePoolSize時,會按照此變量設置時間關閉線程)

                        TimeUnit:單位(一般與keepAliveTime同時使用,供線程池判斷是否滿足關閉線程的條件)

          workQueue:緩沖隊列

RejectedExecutionHandler:拒絕處理任務類(默認:AbortPolicy 會拋異常,見下方實例)。

                  threadFactory:線程工廠(默認:DefaultThreadFactory)

 

二、線程池的幾個主要方法分析

  1 主方法:ThreadPoolExector的execute  

public void execute(Runnable command) {
    if (command ==null)
            thrownew NullPointerException();
            intc = ctl.get();

      //1 當前運行的線程數量小於核心線程數量,直接將任務加入worker啟動運行。
        if (workerCountOf(c) <corePoolSize) {
            if (addWorker(command,true))
                return;
            c =ctl.get();
        } 
        
//2 運行線程數量大於核心線程數量時,上面的if分支針對大於corePoolSize,並且緩存隊列加入任務操作成功的情況。 運行中並且將任務加入緩沖隊列成功,正常來說這樣已經完成了處理邏輯。 但是為了保險起見,增加了狀態出現異常的確認判斷,如果狀態出現異常會繼續remove操作,如果執行true,則按照拒絕處理策略駁回任務; if (isRunning(c) &&workQueue.offer(command)) { intrecheck = ctl.get(); if (!isRunning(recheck) && remove(command)) reject(command); elseif (workerCountOf(recheck) == 0) addWorker(null,false); } //3 這里針對運行線程數量超過了corePoolSize,並且緩存隊列也已經放滿的情況。 注意第二個參數是false,可以在下面addWorker方法看到,就是針對線程池最大線程數量maximumPoolSize的判斷。 elseif (!addWorker(command,false)) reject(command); }

  2 關鍵方法:ThreadPoolExector的addWorker(增加工作線程)

private boolean addWorker(Runnable firstTask, boolean core) {
        retry:
        for (;;) {
            int c = ctl.get();
            int rs = runStateOf(c);

            // Check if queue empty only if necessary.
            if (rs >= SHUTDOWN &&
                ! (rs == SHUTDOWN &&
                   firstTask == null &&
                   ! workQueue.isEmpty()))
                return false;

            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 {
            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.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;
    }

3  Worker中的runWorker方法,也是worker中的run方法主體。

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 {
       //執行任務,並且當執行完后再去獲取新的task繼續執行,getTask方法是由ThreadPoolExecutor提供,繼續向下看。  
while (task != null || (task = getTask()) != null) { w.lock(); // If pool is stopping, ensure thread is interrupted; // if not, ensure thread is not interrupted. This // requires a recheck in second case to deal with // shutdownNow race while clearing interrupt 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;

       //如果運行線程數超過了最大線程數,但是緩存隊列已經空了,這時遞減worker數量。
       //如果有設置允許線程超時或者線程數量超過了核心線程數量,並且線程在規定時間內均未poll到任務且隊列為空則遞減worker數量
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; } } }

三、測試實例:

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ThreadPoolTest {
    // 核心線程數量
    private static int corePoolSize = 3;
    // 最大線程數量
    private static int maxPoolSize = 5;
    // 線程存活時間:當線程數量超過corePoolSize時,10秒鍾空閑即關閉線程
    private static int keepAliveTime = 10000;
    // 緩沖隊列
    private static BlockingQueue<Runnable> workQueue = null;
    // 線程池
    private static ThreadPoolExecutor threadPoolExecutor = null;

    static {
        workQueue = new LinkedBlockingQueue<Runnable>(5);
        threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveTime, TimeUnit.SECONDS,
                workQueue);
    }

    public static void main(String[] args) throws InterruptedException {
        try {
            for (int i = 0; i < 200; i++) {
                System.out.println("=========第" + i + "次");
                threadPoolExecutor.execute(new MyTask());
                System.out.println("線程池中正在執行的線程數量:" + threadPoolExecutor.getPoolSize());
                System.out.println("線程池緩存的任務隊列數量:" + threadPoolExecutor.getQueue().size());
            }
        } finally {
            threadPoolExecutor.shutdown();
        }
    }
}

 

運行結果:

 

 

=========第0次

線程池中正在執行的線程數量:1

線程池緩存的任務隊列數量:0

=========第1次

正在執行任務:pool-1-thread-1

線程池中正在執行的線程數量:2

線程池緩存的任務隊列數量:0

正在執行任務:pool-1-thread-2

=========第2次

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第3次

正在執行任務:pool-1-thread-3

線程池中正在執行的線程數量:3         由於corePoolSize已經滿了,所以開始放緩沖隊列

線程池緩存的任務隊列數量:1

=========第4次

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:2

=========第5次

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:3

=========第6次

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:4

=========第7次

執行完畢:pool-1-thread-2

執行完畢:pool-1-thread-3

正在執行任務:pool-1-thread-2

正在執行任務:pool-1-thread-3

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:3

=========第8次

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:4

=========第9次

執行完畢:pool-1-thread-2

正在執行任務:pool-1-thread-2

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:4

=========第10次

執行完畢:pool-1-thread-1

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:4

=========第11次

執行完畢:pool-1-thread-3

正在執行任務:pool-1-thread-1

執行完畢:pool-1-thread-2

正在執行任務:pool-1-thread-3

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:3

正在執行任務:pool-1-thread-2

執行完畢:pool-1-thread-1

執行完畢:pool-1-thread-3

=========第12次

正在執行任務:pool-1-thread-3

執行完畢:pool-1-thread-2

正在執行任務:pool-1-thread-1

執行完畢:pool-1-thread-3

正在執行任務:pool-1-thread-2

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第13次

執行完畢:pool-1-thread-1

正在執行任務:pool-1-thread-3

正在執行任務:pool-1-thread-1

線程池中正在執行的線程數量:3

執行完畢:pool-1-thread-3

執行完畢:pool-1-thread-2

線程池緩存的任務隊列數量:0

=========第14次

執行完畢:pool-1-thread-1

正在執行任務:pool-1-thread-1

執行完畢:pool-1-thread-1

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第15次

線程池中正在執行的線程數量:3

正在執行任務:pool-1-thread-2

線程池緩存的任務隊列數量:0

=========第16次

執行完畢:pool-1-thread-2

正在執行任務:pool-1-thread-1

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第17次

執行完畢:pool-1-thread-1

線程池中正在執行的線程數量:3

正在執行任務:pool-1-thread-3

線程池緩存的任務隊列數量:0

=========第18次

執行完畢:pool-1-thread-3

正在執行任務:pool-1-thread-2

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

執行完畢:pool-1-thread-2

=========第19次

線程池中正在執行的線程數量:3

正在執行任務:pool-1-thread-1

線程池緩存的任務隊列數量:0

=========第20次

執行完畢:pool-1-thread-1

正在執行任務:pool-1-thread-3

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第21次

執行完畢:pool-1-thread-3

正在執行任務:pool-1-thread-2

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第22次

執行完畢:pool-1-thread-2

正在執行任務:pool-1-thread-1

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第23次

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第24次

正在執行任務:pool-1-thread-3

正在執行任務:pool-1-thread-2

執行完畢:pool-1-thread-1

執行完畢:pool-1-thread-3

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

執行完畢:pool-1-thread-2

=========第25次

線程池中正在執行的線程數量:3

正在執行任務:pool-1-thread-1

線程池緩存的任務隊列數量:0

=========第26次

執行完畢:pool-1-thread-1

正在執行任務:pool-1-thread-3

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第27次

執行完畢:pool-1-thread-3

正在執行任務:pool-1-thread-2

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第28次

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:1

=========第29次

正在執行任務:pool-1-thread-1

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:1

=========第30次

線程池中正在執行的線程數量:3

執行完畢:pool-1-thread-2

線程池緩存的任務隊列數量:1

=========第31次

執行完畢:pool-1-thread-1

正在執行任務:pool-1-thread-3

正在執行任務:pool-1-thread-1

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第32次

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:1

=========第33次

執行完畢:pool-1-thread-1

正在執行任務:pool-1-thread-2

正在執行任務:pool-1-thread-1

線程池中正在執行的線程數量:3

執行完畢:pool-1-thread-3

執行完畢:pool-1-thread-2

執行完畢:pool-1-thread-1

線程池緩存的任務隊列數量:1

=========第34次

正在執行任務:pool-1-thread-3

正在執行任務:pool-1-thread-2

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第35次

執行完畢:pool-1-thread-3

正在執行任務:pool-1-thread-1

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

執行完畢:pool-1-thread-1

執行完畢:pool-1-thread-2

=========第36次

線程池中正在執行的線程數量:3

正在執行任務:pool-1-thread-3

線程池緩存的任務隊列數量:0

=========第37次

執行完畢:pool-1-thread-3

正在執行任務:pool-1-thread-1

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第38次

執行完畢:pool-1-thread-1

正在執行任務:pool-1-thread-2

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第39次

執行完畢:pool-1-thread-2

正在執行任務:pool-1-thread-3

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第40次

執行完畢:pool-1-thread-3

正在執行任務:pool-1-thread-3

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

執行完畢:pool-1-thread-3

=========第41次

線程池中正在執行的線程數量:3

正在執行任務:pool-1-thread-2

線程池緩存的任務隊列數量:0

=========第42次

執行完畢:pool-1-thread-2

正在執行任務:pool-1-thread-1

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第43次

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第44次

正在執行任務:pool-1-thread-3

正在執行任務:pool-1-thread-2

執行完畢:pool-1-thread-1

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第45次

執行完畢:pool-1-thread-2

執行完畢:pool-1-thread-3

正在執行任務:pool-1-thread-2

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第46次

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:1

=========第47次

執行完畢:pool-1-thread-2

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第48次

正在執行任務:pool-1-thread-3

正在執行任務:pool-1-thread-2

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第49次

正在執行任務:pool-1-thread-1

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:1

=========第50次

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:2

=========第51次

執行完畢:pool-1-thread-3

線程池中正在執行的線程數量:3

執行完畢:pool-1-thread-1

執行完畢:pool-1-thread-2

正在執行任務:pool-1-thread-1

線程池緩存的任務隊列數量:2

=========第52次

正在執行任務:pool-1-thread-3

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:1

=========第53次

執行完畢:pool-1-thread-3

執行完畢:pool-1-thread-1

正在執行任務:pool-1-thread-2

正在執行任務:pool-1-thread-1

正在執行任務:pool-1-thread-3

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第54次

執行完畢:pool-1-thread-2

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

執行完畢:pool-1-thread-1

執行完畢:pool-1-thread-3

=========第55次

正在執行任務:pool-1-thread-2

正在執行任務:pool-1-thread-1

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

執行完畢:pool-1-thread-2

=========第56次

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:1

=========第57次

執行完畢:pool-1-thread-1

正在執行任務:pool-1-thread-2

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第58次

執行完畢:pool-1-thread-2

正在執行任務:pool-1-thread-2

正在執行任務:pool-1-thread-3

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第59次

執行完畢:pool-1-thread-2

執行完畢:pool-1-thread-3

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第60次

正在執行任務:pool-1-thread-2

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第61次

正在執行任務:pool-1-thread-1

正在執行任務:pool-1-thread-3

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

執行完畢:pool-1-thread-1

執行完畢:pool-1-thread-2

=========第62次

執行完畢:pool-1-thread-3

正在執行任務:pool-1-thread-1

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第63次

執行完畢:pool-1-thread-1

線程池中正在執行的線程數量:3

正在執行任務:pool-1-thread-1

線程池緩存的任務隊列數量:0

=========第64次

執行完畢:pool-1-thread-1

正在執行任務:pool-1-thread-1

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第65次

執行完畢:pool-1-thread-1

正在執行任務:pool-1-thread-2

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第66次

執行完畢:pool-1-thread-2

線程池中正在執行的線程數量:3

正在執行任務:pool-1-thread-2

線程池緩存的任務隊列數量:0

=========第67次

線程池中正在執行的線程數量:3

執行完畢:pool-1-thread-2

正在執行任務:pool-1-thread-1

線程池緩存的任務隊列數量:0

=========第68次

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

正在執行任務:pool-1-thread-3

執行完畢:pool-1-thread-1

=========第69次

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第70次

正在執行任務:pool-1-thread-2

執行完畢:pool-1-thread-3

正在執行任務:pool-1-thread-1

執行完畢:pool-1-thread-2

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第71次

執行完畢:pool-1-thread-1

正在執行任務:pool-1-thread-3

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第72次

執行完畢:pool-1-thread-3

正在執行任務:pool-1-thread-3

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第73次

執行完畢:pool-1-thread-3

正在執行任務:pool-1-thread-3

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第74次

執行完畢:pool-1-thread-3

正在執行任務:pool-1-thread-2

線程池中正在執行的線程數量:3

執行完畢:pool-1-thread-2

線程池緩存的任務隊列數量:0

=========第75次

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第76次

正在執行任務:pool-1-thread-1

正在執行任務:pool-1-thread-3

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第77次

執行完畢:pool-1-thread-1

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第78次

執行完畢:pool-1-thread-3

正在執行任務:pool-1-thread-1

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第79次

執行完畢:pool-1-thread-1

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第80次

正在執行任務:pool-1-thread-2

正在執行任務:pool-1-thread-3

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第81次

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:1

=========第82次

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:2

=========第83次

執行完畢:pool-1-thread-3

正在執行任務:pool-1-thread-3

正在執行任務:pool-1-thread-1

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:2

=========第84次

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:3

執行完畢:pool-1-thread-1

正在執行任務:pool-1-thread-1

執行完畢:pool-1-thread-2

=========第85次

執行完畢:pool-1-thread-1

執行完畢:pool-1-thread-3

正在執行任務:pool-1-thread-1

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第86次

正在執行任務:pool-1-thread-2

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:1

=========第87次

正在執行任務:pool-1-thread-3

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:2

執行完畢:pool-1-thread-1

正在執行任務:pool-1-thread-1

=========第88次

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:2

=========第89次

執行完畢:pool-1-thread-2

正在執行任務:pool-1-thread-2

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:2

=========第90次

執行完畢:pool-1-thread-1

執行完畢:pool-1-thread-3

正在執行任務:pool-1-thread-1

執行完畢:pool-1-thread-2

正在執行任務:pool-1-thread-2

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第91次

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:1

=========第92次

執行完畢:pool-1-thread-1

正在執行任務:pool-1-thread-3

正在執行任務:pool-1-thread-1

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:1

=========第93次

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:2

執行完畢:pool-1-thread-1

執行完畢:pool-1-thread-2

正在執行任務:pool-1-thread-2

正在執行任務:pool-1-thread-1

=========第94次

執行完畢:pool-1-thread-2

正在執行任務:pool-1-thread-2

執行完畢:pool-1-thread-3

執行完畢:pool-1-thread-1

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第95次

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:1

=========第96次

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:2

=========第97次

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:2

=========第98次

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:3

=========第99次

正在執行任務:pool-1-thread-1

執行完畢:pool-1-thread-2

正在執行任務:pool-1-thread-2

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:2

=========第100次

執行完畢:pool-1-thread-1

正在執行任務:pool-1-thread-1

正在執行任務:pool-1-thread-3

執行完畢:pool-1-thread-1

正在執行任務:pool-1-thread-1

執行完畢:pool-1-thread-2

執行完畢:pool-1-thread-3

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

執行完畢:pool-1-thread-1

正在執行任務:pool-1-thread-2

=========第101次

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第102次

正在執行任務:pool-1-thread-3

正在執行任務:pool-1-thread-1

線程池中正在執行的線程數量:3

執行完畢:pool-1-thread-2

執行完畢:pool-1-thread-1

執行完畢:pool-1-thread-3

線程池緩存的任務隊列數量:0

=========第103次

線程池中正在執行的線程數量:3

正在執行任務:pool-1-thread-2

線程池緩存的任務隊列數量:0

=========第104次

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:1

正在執行任務:pool-1-thread-1

執行完畢:pool-1-thread-2

=========第105次

執行完畢:pool-1-thread-1

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第106次

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:1

=========第107次

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:0

=========第108次

正在執行任務:pool-1-thread-1

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:1

=========第109次

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:2

=========第110次

正在執行任務:pool-1-thread-3

正在執行任務:pool-1-thread-2

執行完畢:pool-1-thread-3

正在執行任務:pool-1-thread-3

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:2

=========第111次

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:3

=========第112次

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:4

=========第113次

執行完畢:pool-1-thread-2

執行完畢:pool-1-thread-1

正在執行任務:pool-1-thread-1

正在執行任務:pool-1-thread-2

線程池中正在執行的線程數量:3

執行完畢:pool-1-thread-3

正在執行任務:pool-1-thread-3

線程池緩存的任務隊列數量:3

=========第114次

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:3

=========第115次

線程池中正在執行的線程數量:3

線程池緩存的任務隊列數量:4

=========第116次

線程池中正在執行的線程數量:3         由於corePoolSize已經滿了,並且緩沖隊列也滿了,所以此時開始增加線程數,之前一直是1,2,3號線程,現在出現4號線程

線程池緩存的任務隊列數量:5

=========第117次

執行完畢:pool-1-thread-2

執行完畢:pool-1-thread-1

正在執行任務:pool-1-thread-2

正在執行任務:pool-1-thread-1

執行完畢:pool-1-thread-3

正在執行任務:pool-1-thread-3

線程池中正在執行的線程數量:4

線程池緩存的任務隊列數量:2

=========第118次

線程池中正在執行的線程數量:4

線程池緩存的任務隊列數量:3

=========第119次

線程池中正在執行的線程數量:4

線程池緩存的任務隊列數量:4

=========第120次

線程池中正在執行的線程數量:4

線程池緩存的任務隊列數量:5

=========第121次

正在執行任務:pool-1-thread-4

執行完畢:pool-1-thread-1

正在執行任務:pool-1-thread-1

執行完畢:pool-1-thread-2

正在執行任務:pool-1-thread-2

執行完畢:pool-1-thread-3

正在執行任務:pool-1-thread-3

執行完畢:pool-1-thread-4

正在執行任務:pool-1-thread-4

線程池中正在執行的線程數量:5

線程池緩存的任務隊列數量:1

=========第122次

線程池中正在執行的線程數量:5

線程池緩存的任務隊列數量:2

正在執行任務:pool-1-thread-5

=========第123次

執行完畢:pool-1-thread-3

線程池中正在執行的線程數量:5

線程池緩存的任務隊列數量:2

=========第124次

線程池中正在執行的線程數量:5

線程池緩存的任務隊列數量:3

=========第125次

線程池中正在執行的線程數量:5

線程池緩存的任務隊列數量:4

=========第126次

線程池中正在執行的線程數量:5

正在執行任務:pool-1-thread-3

執行完畢:pool-1-thread-2

線程池緩存的任務隊列數量:5

=========第127次

線程池中正在執行的線程數量:5       由於已達到maxPoolSize已經滿了,並且緩沖隊列也達到最大值,所以此時新增的任務被駁回,異常見下方。

線程池緩存的任務隊列數量:5

=========第128次

正在執行任務:pool-1-thread-2

執行完畢:pool-1-thread-3

正在執行任務:pool-1-thread-3

執行完畢:pool-1-thread-3

正在執行任務:pool-1-thread-3

執行完畢:pool-1-thread-3

正在執行任務:pool-1-thread-3

執行完畢:pool-1-thread-3

正在執行任務:pool-1-thread-3

執行完畢:pool-1-thread-3

正在執行任務:pool-1-thread-3

執行完畢:pool-1-thread-3

執行完畢:pool-1-thread-1

執行完畢:pool-1-thread-2

執行完畢:pool-1-thread-5

執行完畢:pool-1-thread-4

Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task stone.ripple.util.threadpool.MyTask@42a57993 rejected from java.util.concurrent.ThreadPoolExecutor@75b84c92[Running, pool size = 5, active threads = 5, queued tasks = 5, completed tasks = 118]

at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2047)

at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:823)

at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1369)

at stone.ripple.util.threadpool.ThreadPoolTest.main(ThreadPoolTest.java:30)

執行中:Thread-1

執行中:Thread-4

執行中:Thread-7

執行中:Thread-8

執行中:Thread-9

執行中:Thread-10

執行中:Thread-11

執行中:Thread-12

執行中:Thread-14

執行中:Thread-16

執行中:Thread-15

執行中:Thread-17

執行中:Thread-18

執行中:Thread-20

執行中:Thread-19

執行中:Thread-21

執行中:Thread-5

執行中:Thread-26

執行中:Thread-0

執行中:Thread-2

執行中:Thread-3

執行中:Thread-25

執行中:Thread-24

執行中:Thread-22

執行中:Thread-23

執行中:Thread-13

執行中:Thread-6

執行中:Thread-29

執行中:Thread-31

執行中:Thread-28

執行中:Thread-30

執行中:Thread-33

執行中:Thread-34

執行中:Thread-27

執行中:Thread-35

執行中:Thread-32

執行中:Thread-38

執行中:Thread-37

執行中:Thread-41

執行中:Thread-39

執行中:Thread-36

執行中:Thread-43

執行中:Thread-44

執行中:Thread-45

執行中:Thread-57

執行中:Thread-46

執行中:Thread-58

執行中:Thread-75

執行中:Thread-47

執行中:Thread-74

執行中:Thread-59

執行中:Thread-48

執行中:Thread-76

執行中:Thread-60

執行中:Thread-49

執行中:Thread-50

執行中:Thread-61

執行中:Thread-62

執行中:Thread-51

執行中:Thread-63

執行中:Thread-53

執行中:Thread-66

執行中:Thread-52

執行中:Thread-77

執行中:Thread-67

執行中:Thread-54

執行中:Thread-68

執行中:Thread-55

執行中:Thread-65

執行中:Thread-56

執行中:Thread-64

執行中:Thread-42

執行中:Thread-69

執行中:Thread-78

執行中:Thread-70

執行中:Thread-72

執行中:Thread-71

執行中:Thread-73

執行中:Thread-40

執行中:Thread-79

執行中:Thread-82

執行中:Thread-83

執行中:Thread-85

執行中:Thread-86

執行中:Thread-88

執行中:Thread-90

執行中:Thread-81

執行中:Thread-80

執行中:Thread-98

執行中:Thread-97

執行中:Thread-100

執行中:Thread-96

執行中:Thread-99

執行中:Thread-94

執行中:Thread-101

執行中:Thread-93

執行中:Thread-110

執行中:Thread-102

執行中:Thread-103

執行中:Thread-109

執行中:Thread-111

執行中:Thread-105

執行中:Thread-113

執行中:Thread-104

執行中:Thread-91

執行中:Thread-112

執行中:Thread-106

執行中:Thread-115

執行中:Thread-114

執行中:Thread-107

執行中:Thread-118

執行中:Thread-117

執行中:Thread-92

執行中:Thread-108

執行中:Thread-89

執行中:Thread-87

執行中:Thread-84

執行中:Thread-95

執行中:Thread-123

執行中:Thread-124

執行中:Thread-125

執行中:Thread-126

執行中:Thread-127

執行中:Thread-122

執行中:Thread-121

執行中:Thread-119

執行中:Thread-120

執行中:Thread-116

 

四、總結:

      1. ThreadPoolExecutor從execute方法進入執行任務,當線程數量小於核心線程數量時,增加worker執行任務;

      2. worker進入runWork方法執行,任務執行完成后,會調用getTask獲取新任務,如果不能獲取到新任務,有以下情況:

   【如果已超過corePoolSize並且允許超時,且在規定時間內一直獲取不到新任務worker數量會遞減;

      如果已超過maxPoolSize並且緩存隊列為空worker數量會遞減;

      如果能獲取到新任務以當前線程繼續執行任務;

       3. 如果execute時發現線程數量已經達到corePoolSize,則會將任務加入緩沖隊列;

       4. 如果excute時發現corePoolSize已經達到最大值,並且緩沖隊列也已經達到最大值,則會增加worker,直到maxPoolSize。

       5. 如果excute時發現maxPoolSize已達最大值,並且緩沖隊列也已達到最大值,則會拒絕任務。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM