java线程池

165 阅读1分钟

1.线程池活跃线程。 2.阻塞队列。 3.增加的线程。 4.拒绝策略。

1.ctl。线程池中用一个AtomicInteger表示线程池状态和活动线程数。高三位表示线程池状态。后28位表示线程个数。 线程状态: 1. runing:-1。正在运行中 2. shutdown 0 。 线程池已关闭,已加入线程池中的任务会继续进行。 3. stop 1。 线程池中任务立即停止。 4. tidying 5 terminated

CacheThreadPool SingleThreadPool

int c = ctl.get();
// 判断如果当前线程数小于corePoolSize if (workerCountOf(c) < corePoolSize) { // true:corePoolSize false:maxnumPoolSize // 增加一个线程处理当前任务 if (addWorker(command, true)) return; c = ctl.get(); } // 线程池正在运行中,将任务加入到队列。 if (isRunning(c) && workQueue.offer(command)) { int recheck = ctl.get(); //若线程池挂了,将任务移除队列,执行拒绝策略。 if (! isRunning(recheck) && remove(command)) reject(command);

        // 防止任务都加入了队列,但是线程全都关闭了。感觉一般不会出现这种可能
        else if (workerCountOf(recheck) == 0)
            addWorker(null, false);
    }
    
    //新创建线程处理任务,线程个数不能超过maxnumPoolSize,否则拒绝任务
    else if (!addWorker(command, false))
        reject(command);
        
1.线程池刚初始化,线程数< corePoolSize时。这时候来了任务,直接初始化线程,将任务分配给该线程。
2.当线程数=corePoolSize时。这时候来了任务,加入到队列,由线程自取。线程一直在消费任务
3.当线程数=corePoolSize且队列已经满了,则创建新的线程,并将任务直接分配给该线程。
4.线程数=maxPoolSize,将任务加入队列。若队列已满,执行拒绝策略。