线程池原理最全详解(图文全面总结)

线程池是Java并发编程核心,也是大厂重点考察内容,下面我就全面来详解线程池原理@mikechen

线程池

线程池(Thread Pool)是一种多线程管理技术,它维护了一组预先创建的线程,用来执行提交的任务。

在 Java 中,线程池通过 Executor 接口进行管理, Executors 工具类提供了各种方便的线程池创建方法。

图片

比如:创建一个固定大小的线程池,当所有线程都在执行任务时,新的任务会进入任务队列等待执行。

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4);

通过使用线程池,系统可以避免频繁创建、和销毁线程的开销,从而提高性能和响应速度。

尤其在任务短小且频繁时,通过复用线程,可以避免大量的资源消耗。

线程池实现原理

线程池的实现原理,如下图所示:

主要包含,如下步骤:

第一步:判断核心线程是否有空闲

当有新任务提交到线程池时,线程池会首先检查核心线程池中的线程(数量为 corePoolSize)。

如下所示:

int currentPoolSize = workerCount.get();   if (currentPoolSize < corePoolSize) {       if (addWorker(command, true)) // 创建核心线程执行任务           return;   }

如果核心线程数小于 corePoolSize,或者有核心线程处于空闲状态,线程池会直接创建一个新的核心线程来执行这个任务。

第二步:判断工作队列是否已满

如果核心线程都在执行任务,且线程数量已经达到 corePoolSize,则任务不会立即创建新的线程,而是进入任务队列。

如下所示:

// 第二步:尝试将任务添加到队列    if (workQueue.offer(command)) {        int recheck = workerCount.get();        if (recheck == 0) // 如果线程池空闲,启动一个核心线程            addWorker(null, false);    }

第三步:判断线程池的最大线程数

如果任务队列已满,且线程池中的线程数少于 maximumPoolSize。

线程池会尝试创建一个新的非核心线程(即超出 corePoolSize 的线程),用于处理当前提交的任务。

如下所示:

// 第三步:如果队列满了,判断是否可以创建新的非核心线程   else if (!addWorker(command, false)) {       // 第四步:如果无法创建新的非核心线程,执行拒绝策略       reject(command);   }

第四步:拒绝策略

当任务队列已满,且线程池中的线程数已经达到 maximumPoolSize 时,线程池无法接纳更多任务,这时线程池会使用预设的 饱和策略 来处理这个任务。

// 第四步:如果无法创建新的非核心线程,执行拒绝策略       reject(command);

常见的饱和策略包括:

  • AbortPolicy:默认策略,抛出 RejectedExecutionException 异常,通知提交任务的线程池已满;

  • CallerRunsPolicy:让提交任务的线程自己执行这个任务,以减少新任务提交的压力;

  • DiscardPolicy:直接丢弃当前提交的任务,不做任何处理;

  • DiscardOldestPolicy:丢弃队列中最老的任务,然后尝试提交新任务。

线程池的注意事项

图片

根据系统负载、CPU 核心数、和任务类型进行配置。

比如:CPU 密集型任务,可以设置 corePoolSize 接近 CPU 核心数;

I/O 密集型任务,可以设置较高的 corePoolSize,允许更多线程等待 I/O 操作。

还有一个,非常重要的阻塞队列。

无界队列,适合任务处理速度较快、不会积压太多任务的场景。

有界队列,适用于任务量高的场景,通过限制队列长度防止任务过载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这孩子叫逆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值