谈谈你对线程池的理解

线程池的本质

线程池的本质是一种池化技术。而池化技术是资源复用的一个设计思想。

比较常见的池化技术有:连接池、内存池和对象池。

线程池、字符串常量池、数据库连接池的使用都离不开池化思想。

底层工作原理

比如银行办公窗口满了,阻塞队列(候客区)也满了,这个时候需要扩容银行的加班窗口,扩容后新进来的线程会直接抢占新扩容的加班窗口,若任务还在持续增加会启动饱和拒绝策略,若热任务量下降了(多余空闲线程的存活时间)会缩容。

核心设计目的

线程池里面复用的是线程资源,它的核心设计目的有两个:

  1. 减少线程的频繁创建和销毁带来的性能开销,因为线程创建会涉及到CPU上下文切换内存分配等工作。
  2. 线程池本身会有参数来控制线程创建的数量,这样就可以避免无休止的创建线程带来的资源利用率过高的问题,起到了资源保护的作用。

线程复用技术

因为线程本身并不是一个受控的技术,也就是说线程的生命周期是由任务的运行状态来决定的。无法去人为控制。

所以为了实现线程的复用,线程池里面用到了阻塞队列

简单来说,就是线程池里面的工作线程处于一直运行状态。它会去从阻塞队列里面去获取待执行的一个任务。一旦队列空了,那么这个工作线程就会被阻塞。直到下一次有新的任务进来。

也就是说工作线程是根据任务的情况来决定阻塞和唤醒。从而去达到线程复用的一个目的。

最后线程池里面的资源限制是通过几个关键参数来控制的。分别是核心线程数最大线程数。核心线程数表示默认长期存在的工作线程。而最大的线程数是根据任务的情况来动态创建的线程。

它的主要目的是为了提高阻塞队列中任务的处理效率。

线程池的作用

提高资源的利用率。

不使用线程池的线程操作步骤

  1. 手动创建线程对象
  2. 执行任务
  3. 执行完毕,释放线程对象

源代码思想体现

其中的动态扩容和缩容思想、线程的复用思想以及线程的回收方法等等。

参考资料

  1. 谈谈你对线程池的理解
  2. 【Java面试必问】【多线程开发必用JUC】学姐带你学Java并发包-JUC
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值