Java线程池ThreadPoolExcutor

线程池原理:https://www.jianshu.com/p/23cb8b903d2c
线程池中的锁

1.线程池的工作原理:

在这里插入图片描述

1.1 线程池刚创建时,里面没有一个线程。任务队列是作为参数传进来的。不过,就算队列里面有任务,线程池也不会马上执行它们。
1.2 当调用execute()方法添加一个任务时,线程池会做如下判断:
a.如果正在运行的线程数小于corePoolSize,那么马上创建线程运行这个任务。
b.如果正在运行的线程数大于或者等于corePoolSize,那么将这个任务放入队列。
c.如果这个时候队列满了,而且正在运行的线程数量小于maximumPoolSize,那么还是要创建线程运行这个任务。
d.如果队列满了,而且正在运行的线程数量大于或等于 maximumPoolSize,那么线程池会抛出异常,告诉调用者“我不能再接受任务了”
1.3 当一个线程完成任务时,它会从队列中取下一个任务来执行。
1.4 当一个线程无事可做,超过一定的时间(keepAliveTime)时,线程池会判断,如果当前运行的线程数大于corePoolSize时,那么这个线程会被停用掉,所以线程池的所有任务完成后,它最终会收缩到corePoolSize的大小。

2.线程池有哪些配置

线程池可以使用java.util.concurrent.ThreadPoolExecutor来创建,在该类中包含最全参数的构造函数

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler)
1、maximumPoolSize:线程池最大线程数,表示在线程池中最多能创建多少个线程。如果当线程池中的数量到达这个数字时,
新来的任务会抛出异常。
2、keepAliveTime:表示线程没有任务执行时最多能保持多少时间会停止,然后线程池的数目维持在corePoolSize。
3、unit:参数keepAliveTime的时间单位
4、workQueue:一个阻塞队列,用来存储等待执行的任务,如果当前对线程的需求超过了5、corePoolSize大小,才会放在这里。
6、threadFactory:线程工厂,主要用来创建线程,比如指定线程的名字。
7、handler:如果线程池已满,新的任务处理方式。

3.线程池的阻塞队列包含哪几种选择

1. ArrayBlockingQueue
2. LinkedBlockingQueue
3. PriorityBlockingQueue
4. SynchronousQueue
1. ArrayBlockingQueue是一个有边界的阻塞队列,它的内部实现是一个数组。它的容量在初始化时就确定不变。
2. LinkedBlockingQueue:阻塞队列大小的配置是可选的,其内部实现是一个链表。
3. PriorityBlockingQueue:是一个没有边界的队列,所有插入到PriorityBlockingQueue的对象必须实现
java.lang.Comparable接口,队列优先级的排序就是按照我们对这个接口的实现来定义的。
4. SynchronousQueue队列内部仅允许容纳一个元素。当一个线程插入一个元素后会被阻塞,除非这个元素被另一个线程消费。

4.如果线程池已经满了可是还有新的任务提交怎么办

线程池已经满的定义,是指运行线程数 == maximumPoolSize,并且workQueue是有界队列并且已满。
这时候再提交任务怎么办呢?线程池会将任务传递给最后一个参数RejectedExecutionHandler来处理,
比如打印报错日志、抛出异常、存储到Mysql/redis用于后续处理等等,线程池默认也提供了几种处理方式;

参考:1、拒绝策略
2、https://blog.csdn.net/yanluandai1985/article/details/82423767

欢迎关注我的微信公众号,不定期更新文章和大家一起学习共勉

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值