线程池实现原理_Java线程池的工作原理

本文详细解析了Java线程池的工作原理,包括核心线程池、非核心线程、工作队列及拒绝策略等内容,并通过实例展示了线程池如何处理不同数量的任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java中的线程池是我们平时经常用的技术,但是线程池到底如何工作的,它的工作原理是什么样的呢?只有深刻的了解它的原理才能更好的在工作中使用它。

d8e30ebac95fd08548c5e9bf6513442a.png

线程池工作原理

如上图所示,是一个线程池的工作原理示意图,基于整个图我们分析一下线程池的工作原理。

我们先看一下源码,了解一下线程池的组成。

源码:

public class ThreadPoolExecutor extends AbstractExecutorService {    //线程池的工作队列,主要是存放暂时没有线程处理的任务   private final BlockingQueue workQueue;  //工作线程集合  private final HashSet workers = new HashSet();//最大线程池规模  private int largestPoolSize;  //线程工厂,创建线程用的private volatile ThreadFactory threadFactory;  //线程存活时长,就是超过这个时长会被回收  private volatile long keepAliveTime;  //设置核心线程空闲是否超时,核心线程默认不回收  private volatile boolean allowCoreThreadTimeOut;  //核心线程池大小,超过这个部分的是非核心线程  private volatile int corePoolSize;  //最大线程池大小  private volatile int maximumPoolSize;  //拒绝策略,默认放弃策略,一共4中策略,还可以自定义  private static final RejectedExecutionHandler defaultHandler =        new AbortPolicy();省略其他部分}

从源码中,可以看出线程主要的几个部分是,核心线程池,非核心线程,工作队列,拒绝策略,

跟我画的示意图吻合,接下来具体说明一下线程池的工作原理。

例子:假设线程池有设置了3个核心线程,最大线程数是6,然后来了10个任务的需要处理。

1、首先,当任务数小于等于核心线程池大小(corePoolSize)时,由核心线程处理。

譬如,当task1进入线程池,线程池创建一个核心线程处理任务,假设任务没有处理完,接下来

接着来了两个任务,task2,task3,那么同样还会创建两个核心线程来处理任务。即

2、其次,当任务大于核心线程数时,核心线程没有闲置的且任务队列没有满,这个时候任务会进入任务队列。

譬如,当task4,task5,task6一起进入线程池,核心线程都在工作,没法处理新来的任务,所以,task4,task5,task6会进入队列等待。

3、再次,如果任务数大于核心线程数,核心线程没有闲置的且任务队列满了,那么这个时候会创建新的非核心线程来处理任务。

譬如,当task7,task8,task9一起进入线程池,核心线程都在工作,没法处理新来的任务,任务队列也满了,所以,线程池需要创建新的非核心线程来处理任务,因为线程池的最大大小(maximumPoolSize)是6,所以只能创建3个非核心线程。

4、最后,如果线程池线程数达到最大,且任务队列也满了,再来任务就进行拒绝策略处理了。

譬如,最后task10进入线程池,这个时候线程都在工作,且任务队列也已经满了,task10只能进行拒绝策略处理了。

以上就是Java线程池完整的正向工作原理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值