zoukankan      html  css  js  c++  java
  • 线程池execute执行顺序

    // 提交任务,任务并非立即执行,所以翻译成执行任务似乎不太合适
    public void execute(Runnable command) {
        // 任务不能为空
        if (command == null)
            throw new NullPointerException();
            
        // 控制变量(高3位存储状态,低29位存储工作线程的数量)
        int c = ctl.get();
        // 1. 如果工作线程数量小于核心数量
        if (workerCountOf(c) < corePoolSize) {
            // 就添加一个工作线程(核心)
            if (addWorker(command, true))
                return;
            // 重新获取下控制变量
            c = ctl.get();
        }
        // 2. 如果达到了核心数量且线程池是运行状态,任务入队列
        if (isRunning(c) && workQueue.offer(command)) {
            int recheck = ctl.get();
            // 再次检查线程池状态,如果不是运行状态,就移除任务并执行拒绝策略
            if (! isRunning(recheck) && remove(command))
                reject(command);
            // 容错检查工作线程数量是否为0,如果为0就创建一个
            else if (workerCountOf(recheck) == 0)
                addWorker(null, false);
        }
        // 3. 任务入队列失败,尝试创建非核心工作线程
        else if (!addWorker(command, false))
            // 非核心工作线程创建失败,执行拒绝策略
            reject(command);
    }
  • 相关阅读:
    2032 杨辉三角
    2023 求平均成绩
    幸运数
    扑克牌大小
    single-number
    合唱队
    Problem A: 【字符串】最长回文子串
    Problem A: 最大连续子序列
    数串
    02CSS3基本语法05
  • 原文地址:https://www.cnblogs.com/zzq-include/p/13529880.html
Copyright © 2011-2022 走看看