美文网首页
线程池execute方法源码

线程池execute方法源码

作者: 火乐君_52cd | 来源:发表于2020-03-25 22:51 被阅读0次
    // 存放线程池的运行状态 (runState) 和线程池内有效线程的数量 (workerCount)
       private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
    
        private static int workerCountOf(int c) {
            return c & CAPACITY;
        }
    
        private final BlockingQueue<Runnable> workQueue;
    
        public void execute(Runnable command) {
            // 如果任务为null,则抛出异常。
            if (command == null)
                throw new NullPointerException();
            // ctl 中保存的线程池当前的一些状态信息
            int c = ctl.get();
    
            //  下面会涉及到 3 步 操作
            // 1.首先判断当前线程池中之行的任务数量是否小于 corePoolSize
            // 如果小于的话,通过addWorker(command, true)新建一个线程,并将任务(command)添加到该线程中;然后,启动该线程从而执行任务。
            if (workerCountOf(c) < corePoolSize) {
                if (addWorker(command, true))
                    return;
                c = ctl.get();
            }
            // 2.如果当前之行的任务数量大于等于 corePoolSize 的时候就会走到这里
            // 通过 isRunning 方法判断线程池状态,线程池处于 RUNNING 状态才会被并且队列可以加入任务,该任务才会被加入进去
            if (isRunning(c) && workQueue.offer(command)) {
                int recheck = ctl.get();
                // 再次获取线程池状态,如果线程池状态不是 RUNNING 状态就需要从任务队列中移除任务,并尝试判断线程是否全部执行完毕。同时执行拒绝策略。
                if (!isRunning(recheck) && remove(command))
                    reject(command);
                    // 如果当前线程池为空就新创建一个线程并执行。
                else if (workerCountOf(recheck) == 0)
                    addWorker(null, false);
            }
            //3. 通过addWorker(command, false)新建一个线程,并将任务(command)添加到该线程中;然后,启动该线程从而执行任务。
            //如果addWorker(command, false)执行失败,则通过reject()执行相应的拒绝策略的内容。
            else if (!addWorker(command, false))
                reject(command);
        }
    

    相关文章

      网友评论

          本文标题:线程池execute方法源码

          本文链接:https://www.haomeiwen.com/subject/vepfuhtx.html