27
2020
07

线程池原理之执行流程

75d71bfdf5947681580fccd366a6e6c6.jpg

//ThreadPoolExecutor.java

public void execute(Runnable command) {

    ...

    if (workerCountOf(c) < corePoolSize) { //plan A

        if (addWorker(command, true))  

            return;

        c = ctl.get();

    }

    if (isRunning(c) && workQueue.offer(command)) { //plan B

        int recheck = ctl.get();

        if (! isRunning(recheck) && remove(command))

            reject(command);

        else if (workerCountOf(recheck) == 0)

            addWorker(null, false);

    }

    //addWorker(command, false) false代表可创建非核心线程来执行任务

    else if (!addWorker(command, false)) //plan C

        reject(command);    // //plan D

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

plan A:任务的execute,先判断核心线程数量达到上限;否,则创建核心线程来执行任务;是,则执行plan B

plan B:当任务数大于核心数时,任务被加入阻塞队列,如果超过阻塞队列的容量上限,执行C

plan C: 阻塞队列不能接受任务时,且设置的maximumPoolSize大于corePoolSize,创建新的非核心线程执行任务

plan D:当plan A、B、C都无能为力时,使用拒绝策略处理

« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。