线程池

为什么用线程池,解释下线程池参数
  • 降低资源消耗,提高线程利用率。省掉了创建和销毁两步操作。
  • 提高响应速度。
  • 提高线程的管理性,线程池可以统一分配调优监控。
  • corePoolSize:核心线程数,也就是正常情况下创建的工作的线程数,这些线程创建后不会消失。
  • maxinumPoolSize:最大线程数,表示允许被创建的最大线程数。
  • keepAliveTime、unit表示超出核心线程数之外的线程的空闲存活时间。
  • workQueue:用来存放待执行任务。(当核心线程数都已被使用,还有任务进来时,先不会创建最大线程数,而是放入队列,直到队列北被放满仍有任务还在持续进入则会开始创建新的线程)。
  • ThreadFactory:线程工厂,用来生产线程执行任务,默认的创建工厂产生的线程都在同一个组内,拥有相同的优先级,且都不是守护线程。
  • Handler:任务拒绝策略。当我们调用shutdown等方法关闭线程池后,这时候即时线程池内部还有没执行完的任务正在进行,但由于线程池已经关闭,我们再继续提交任务就会被拒绝;或者当达到最大线程数,线程池已经没有能力继续处理新提交的任务时,这也会被拒绝。
线程池的处理流程

首先是线程执行任务时,先判断核心线程数是否已满,未满的话创建核心线程执行,已满的话会再判断任务队列是否已满,任务队列没满的话,将任务放到任务队列中,已满的话再判断最大线程数是否达到,未达到的话会创建一个临时线程来执行(临时线程完全空闲下来后会被回收),已到达的话,就会根据任务拒绝策略来处理。

线程中阻塞队列的作用

一般的队列只能保证作为一个有限长度的缓冲区,如果超出了缓冲长度,就无法保留当前的任务了,而阻塞队列可以通过阻塞来保留当前想要继续入列的任务。并且阻塞队列自带阻塞和唤醒功能,不需要额外的处理。并且无任务执行时,线程池利用阻塞队列的take方法,使线程进入wait状态,释放cpu,从而保证核心线程数的存活,不至于一直占用资源。

为什么先添加队列而不是先创建最大线程?

因为在创建线程的时候,是要获取全局锁的,这个时候会影响整体效率,并且线程池的初衷是尽量减少线程的创建和销毁的。最大线程数主要是为了应对业务的一个峰值,繁忙期。比如双十一双十二繁忙季时候,电商都会去招一些临时工,而平时都是会选择短暂积压的。

线程中线程复用原理

线程池将线程和任务进行解耦,线程是线程,任务是任务,摆脱了之前通过Thread创建线程时的一个线程必须对应一个任务的限制。
在线程池中,同一个线程可以从阻塞队列中不断获取新任务来执行,其核心原理在于线程池对thread进行了封装,并不是每次执行任务都会调用Thread.start()来创建新线程,而是让每个线程去执行一个“循环”,在“循环”中会不停检查是否有任务需要被执行,如果有则直接执行,也就是调用任务中的run方法,将run方法当一个普通方法执行,通过这种方式只使用固定的线程就将所有任务的run方法串联起来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值