【JUC】ThreadPoolExecutor任务执行-execute

本文详细解析了ThreadPoolExecutor的execute方法,包括其核心逻辑、线程池规模判断、任务入队及线程创建过程,同时介绍了线程池状态检查、任务拒绝策略等关键点。

任务执行

ThreadPoolExecutor执行任务的主要方法为:execute、submit、invoke及其重载。

execute

execute 函数定义

public void execute(Runnable command) 

execute函数功能说明

提交任务到线程池执行。

execute源码

if (command == null)
    throw new NullPointerException();
// 获取ctl
int c = ctl.get();
// 计算当前线程池中的worker数量是否小于corePoolSize
// 线程池线程数量小于corePoolSize就立即添加worker执行任务
if (workerCountOf(c) < corePoolSize) {
    // 如果小于corePoolSize则新建线程向线程池中添加该线程
    if (addWorker(command, true))
        // 添加线程成功直接return
        return;
    c = ctl.get();
}

// 下面代码处理任务没有直接添加worker执行场景,就是线程池当前的线程数大于等于corePoolSize场景
// 如果线程池处于RUNNING状态,那么就将任务添加到等待队列中
 if (isRunning(c) && workQueue.offer(command)) {
    int recheck = ctl.get();
    // 将任务添加到队列后再次检查是否线程池是否处于运行状态
    // 如果线程池不在运行状态,那么就将任务从任务队列中移除
    // 并且调用Reject策略
    if (! isRunning(recheck) && remove(command))
        reject(command);
    // 检查worker数量是否为0,如果为0则向线程池添加worker
    // 如果进入到这个分支的话,那么线程池处于RUNNING状态或者线程池不处于RUNNING状态且从工作队列中移除任务失败
    // 这里检查工作线程是否为0是为了防止线程池没有可以执行任务的线程
    else if (workerCountOf(recheck) == 0)
        addWorker(null, false);
}
// 如果线程池不处于运行状态或者任务不能入队就尝试添加线程池,那么这里会尝试增加工作线程数量
// 如果线程没有新建成功,那么此时线程池可能已经停止或者饱和(已经达到最大线程数且队列已经达到最大数量)
// 那么就调用Reject策略
else if (!addWorker(command, false))
    reject(command);
ThreadPoolExecutorJava 中的一个线程池实现,它提供了一种管理线程的机制,可以有效地控制线程的数量,避免因为线程过多而导致系统资源的浪费和性能下降。 ThreadPoolExecutor 的主要构造函数如下: ``` public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) ``` 其中,各个参数的含义如下: - `corePoolSize`:核心线程数,即线程池中保持的最少线程数。 - `maximumPoolSize`:线程池所能容纳的最大线程数。 - `keepAliveTime`:线程池中超过 `corePoolSize` 的空闲线程能够存活的最长时间。 - `unit`:`keepAliveTime` 的时间单位。 - `workQueue`:任务队列,用于保存等待执行的任务。 - `threadFactory`:线程工厂,用于创建新线程。 - `handler`:拒绝策略,用于当任务队列满了且当前线程数已达到最大线程数时如何处理新任务。 ThreadPoolExecutor 在初始化时会创建 `corePoolSize` 个线程,并将剩余的任务添加到任务队列 `workQueue` 中。当任务队列满了时,如果当前线程数小于 `maximumPoolSize`,则会创建新的线程来执行任务;如果当前线程数已达到最大线程数,则会根据拒绝策略 `handler` 来处理新任务。 ThreadPoolExecutor 还提供了一些方法,如 `execute()`、`submit()`、`shutdown()` 等,用于提交任务、关闭线程池等操作。需要注意的是,当使用完线程池后,应该及时调用 `shutdown()` 方法来关闭线程池以释放资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值