JUC线程池

线程池

线程池的优势
线程池做的工作主要是控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等待,等待其他线程执行完毕,再从队列中去除任务来执行。
它的主要特点为:线程复用;控制最大并发数;管理线程
第一:降低资源消耗。通过重复利用已经创建的线程降低线程创建和销毁所造成的消耗。
第二:提高响应速度。当任务到达时,任务可以不需要等待线程创建就能立即执行。
第三:提高线程的可管理性。线程时稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,利用线程池可以进行统一的分配,调优和监控。
Java中的线程池是通过Executor框架实现的,该框架中用到了Executor,Executors,ExecutorService,ThreadPoolExecutor这几个类

Executors创建线程的三个方法:
ExecutorService threadPool = Executors.newFixedThreadPool(5);	//固定容量
ExecutorService threadPool = Executors.newSingleThreadExecutor(); 	//单例的、单个线程的线程池
ExecutorService threadPool = Executors.newCachedThreadPool(); 	//缓存的 即超出就自动创建线程的

上面的方法返回的实际上只是一个ThreadPoolExecutor,利用构造器传入的不同的参数而已,而且我们也能发现底层是阻塞队列。
同时说明我们也可以通过ThreadPoolExecutor`来创建线程池,Executors只是一个创建线程池的工具类,实际上返回的还是ThreadPoolExecutor。
在这里插入图片描述
看到他有七个参数:下图是这七大参数的解释
在这里插入图片描述
接下来结合下图理解理解上述的7大参数:
首先看看线程池的底层工作原理图:
在这里插入图片描述
看上图以及参数解析对照我们可以知道maximumPool包含corePool,maximumPool表示最多能放的线程数,而corePool表示的就是线程的常驻数,可以理解为银行的有最多有5个受理窗口,但是常用的却只有2个,而候客区就相当于我们的阻塞队列(BlockingQueue),那当我们的阻塞队列满了之后,handle拒绝策略出来了,相当于银行门口立了块牌子,上面写着不办理后面的业务了!然后当客户都办理的差不多了,此时多出来(在corePool的基础上扩容的窗口)的窗口在经过keepAliveTime的时间后就关闭了,重新恢复到corePool个受理窗口。
接着再来总结一下线程池的工作流程:
首先线程池接收到任务,先判断核心线程数是否满了,没有满接客,满了就放到阻塞队列,如果阻塞队列没满,这些任务放在阻塞队列,如果满了,就扩容线程数到最大线程数,如果最大线程数也满了,就是我们的拒绝策略。这就是线程池四大步骤。 接客、放入队列,扩容线程,拒绝策略!
也可以看此图:
在这里插入图片描述
实际开发中线程池不允许使用Executors出创建,而是通过ThredPoolExecutor的方式,因为Executor创建出的线程池允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,导致OOM。
或者允许创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,导致OOM。

在这里插入图片描述
线程池的四大拒绝策列:上述是JDK四大拒绝策列

  • AbortPolicy(默认):直接抛出异常
  • CallerRunsPolicy:多出的任务会交给上级
  • DiscardOldestPolicy:抛弃队列中等待最久的任务,然后把当前任务加入到队列中尝试再次提交任务
  • DiscardPolicy:直接丢弃无法处理的任务,不处理也不抛出任何一场

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值