java基础-线程池

为什么使用线程池?
JVM在HotSpot的线程模型下,Java线程会一对一映射为内核线程;
意味着,在Java中每次创建以及回收线程都会去内核创建以及回收;
就有可能导致:创建和销毁线程所花费的时间和资源可能比处理的任务花费的时间和资源要更多;
线程池的出现是为了提高线程的复用性以及固定线程的数量!!!
1.降低资源消耗:提高线程利用率,降低创建和销毁线程的消耗;
2.提高相应速度:任务来了,直接又想成可以执行,而不是先创建在执行
3.提高线程的可管理性:线程是稀缺的资源,使用线程池可以同意分配调优监控
创建线程池的方式,以及核心参数是什么?
用ThreadPoolExecutor去创建线程池,使用ThreadPoolExecutor创建的线程你是更能了解线程池运行的规则,避免资源耗尽的风险。
ThreadPoolExecutor在构造的时候有几个重要的参数,分别是:
corePoolSize(核心线程数量):也就是正常情况下创建工作的线程数,这些线程创建后并不会消除,而是常驻线程。
maximumPoolSize(最大线程数量):它与核心线程数相对应,表示最大允许被创建的线程数。
keepAliveTime(线程空余时间):表示超出核心线程数之外的线程的空闲存活时间,也就是核心此案成不会消除,但是超出核心线程的部分线程如果空闲一定的时间则会被消除,我们可以通过设置空闲时间。
workQueue(阻塞队列):用来存放待执行的任务,假设我们现在核心线程都已被使用,还有任务进来则全部放入队列,知道整个队列被放满单任务还在持续进入则会开始创建新的线程。
handler(任务拒绝策略):有两种情况,第一种是当我们调用shutdown等方法关闭线程池后,这时候及时线程池内部还灭有执行完饿任务正在执行,但是由于线程池已经关闭,我们再继续向线程池提交任务就会遭到拒绝。另一种情况就是当达到最大线程数,线程池已经没有能力继续处理新提交的任务时。
任务提交的流程,分别对应着几个参数的作用
1):首先会判断运行线程数是否小于corePoolSize,如果小于,则直接创建新的线程执行任务
2):如果大于corePoolSize,判断workQueue阻塞队列是否已满,如果还没满,则将任务放到阻塞队列中
3):如果workQueue阻塞队列已经满了,则判断当前线程数是否大于maximumPoolSize,如果没大于则创建新的线程执行任务
4):如果大于maximumPoolSize,则执行任务拒绝策略(具体就是你自己实现的handler)
有个点需要注意下,就是workQueue阻塞队列满了,但当前线程数小于maximumPoolSize,这时候会创建新的线程执行任务;
一般我们都是将corePoolSize和maximumPoolSize设置相同数量
keepAliveTime指的就是,当前运行的线程数大于核心线程数了,只要空闲时间达到了,就会对线程进行回收。

拒绝策略有哪些?
主要有4种拒绝策略:

AbortPolicy:直接丢弃任务,抛出异常,这是默认策略
CallerRunsPolicy:只用调用者所在的线程来处理任务
DiscardOldestPolicy:丢弃等待队列中最旧的任务,并执行当前任务
DiscardPolicy:直接丢弃任务,也不抛出异常

线程池中阻塞队列的作用?为什么是先添加队列而不是先创建最大线程?

1.一般的队列只能保证作为一个有限长度的缓冲区,如果超出了缓冲长度,就无法保留当前的任务了,阻塞队列通过阻塞可以保留住当前想要继续入队的任务。
阻塞队列可以保证任务队列中没有任务时阻塞获取任务的线程,使得线程进入wait状态,释放CPU资源
阻塞队列自带阻塞和唤醒的功能,不需要额外处理,无任务执行时,线程利用阻塞队列的take方法挂起,从而维持核心线程的存活,不至于一直占用cpu资源。
2.在创建新线程的时候,是要获取全局锁,这个时候其他的就得阻塞,影响整体效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值