核心线程数是0,队列是无界队列,最大线程数是n,线程池的工作流程

结论:

        因核心线程数是0,任务提交后会进入到阻塞队列中,由于加入阻塞队列后会判断当前线程数是否为0,为0的话,会创建1个线程来执行阻塞队列中的任务,但该流程只会进入一次,则在整个流程中只会有一个线程来执行任务。

分析:

public void execute(Runnable command) {
        if (command == null)
            throw new NullPointerException();
        int c = ctl.get();
        if (workerCountOf(c) < corePoolSize) {
            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);
            // 若当前工作线程为0,会创建1个线程去执行阻塞队列中的人物
            else if (workerCountOf(recheck) == 0)
                addWorker(null, false);
        }
        else if (!addWorker(command, false))
            reject(command);
    }

示例验证:

corePoolSize:0
maximumPoolSize:2
workQueue:LinkedBlockingQueue

提交10个任务

public void createThreadPool() {
        ThreadPoolExecutor pool = new ThreadPoolExecutor(
                0, 2, 0L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
        for (int i = 0; i < 10; i++) {
            int j = i;
            pool.execute(new Runnable() {
                @Override
                public void run() {
                    //获取线程名称
                    Thread thread = Thread.currentThread();
                    String name = thread.getName();
                    try {
                        Thread.sleep(5000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    //输出
                    int activeCount = pool.getActiveCount();
                    System.out.println("任务:"+j+"-----,线程名称:"+name+"-----活跃线程数:"+activeCount);
                }
            });
        }
        pool.shutdown();
    }

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值