线程池的-任务执行机制

本文详细探讨了Java线程池的任务执行机制,包括任务调度、任务缓冲、任务申请和任务的拒绝策略。在任务调度阶段,execute方法根据线程池状态、核心线程数、阻塞队列状态决定任务执行方式。任务缓冲通过阻塞队列实现任务与线程的解耦。当线程池达到最大容量且队列已满时,将应用拒绝策略处理任务。
摘要由CSDN通过智能技术生成

线程池的任务执行机制

欢迎订阅我的线程池专栏

任务调度

任务调度是线程池的主要入口(execute(Runnable r)),接下来任务如何执行都是有这个阶段决定的;

所有的任务调度都是有execute方法完成,检查现在线程池的运行状态,运行的线程数,运行策略,决定接下来执行的流程,是直接申请线程执行,还是缓冲到队列中执行,亦或是直接拒绝该任务;

执行过程如下:
1.首先检查线程池的运行状态,如果不是RUNNING,则直接拒绝,线程池要保证在RUNNING状态下执行任务
2.如果workCount < corePoolSize,则创建并启动一个线程来执行新提交的任务
3.如果workCount > corePoolSize 且线程池中阻塞队列未满,则任务添加到阻塞队列中
4.如果workCount > corePoolSize && workCount < maximumPoolSize 且线程池的阻塞队列已经满了,则创建并且启动一个线程来执行新的任务,
5.如果workCount > maximumPoolSize,并且线程池的队列已经满了,则根据拒绝策略来处理该任务;默认的方式是直接抛出异常

在这里插入图片描述
结合代码分析
只是把核心的代码写出来了

public void execute(Runnable command) {
   
       
        int c = ctl.get();
        // 判断当前线程数是否小于核心线程数 如果小于核心线程数 添加工作线程
        //可能有小伙伴会有疑问?这不是首先判断线程池的状态?
        //线程池的状态判断都是在addWorkder()方法中判断的;
        if (workerCountOf(c) < corePoolSize) {
       
			// 添加核心线程成功,结束;
            if (addWorker(command, true))
                return;
            c = ctl.get();
        }
        //程序走到这一步 workCount >= corePoolSize;
        // 线程是否正在运行,如果添加队列成功,说明队列没有满
        // 如果添加队列失败说明,队列已经满了
        
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值