• 【Java面试】简述一下你对线程池的理解?


    到底是什么面试题,

    让一个工作了4年的精神小伙,只是去参加了一场技术面试,

    就被搞得精神萎靡。郁郁寡欢!

    这一切的背后到底是道德的沦丧,还是人性的扭曲。

    让我们一起揭秘一下这道面试题。

    关于, “简述你对线程池的理解”,看看普通人和高手的回答。

    普通人:#

    嗯。。。。。。。。。。

    高手:#

    关于这个问题,我会从几个方面来回答。

    首先,线程池本质上是一种池化技术,而池化技术是一种资源复用的思想,比较常见的有连接池、内存池、对象池。

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

    1. 减少线程的频繁创建和销毁带来的性能开销,因为线程创建会涉及到CPU上下文切换、内存分配等工作。

    2. 线程池本身会有参数来控制线程创建的数量,这样就可以避免无休止的创建线程带来的资源利用率过高的问题,

      起到了资源保护的作用。

    其次,我简单说一下线程池里面的线程复用技术。因为线程本身并不是一个受控的技术,也就是说线程的生命周期时由任务运行的状态决定的,无法人为控制。

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

    也就是说,工作线程是根据任务的情况实现阻塞和唤醒,从而达到线程复用的目的。

    最后,线程池里面的资源限制,是通过几个关键参数来控制的,分别是核心线程数、最大线程数。

    核心线程数表示默认长期存在的工作线程,而最大线程数是根据任务的情况动态创建的线程,主要是提高阻塞队列中任务的

    处理效率。image-20220422153602866

    以上就是我对这个问题的理解!

    总结#

    我当时在阅读线程池的源码的时候,被里面的各种设计思想惊艳到了。

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

    我发现越是简单的东西,反而越不简单。

    更多的面试资料和面试技巧,可以私信我获取。

    file

    版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Mic带你学架构
    如果本篇文章对您有帮助,还请帮忙点个关注和赞,您的坚持是我不断创作的动力。欢迎关注「跟着Mic学架构」公众号公众号获取更多技术干货!

  • 相关阅读:
    双软认证需要什么条件
    5分钟了解数据结构
    GO语言实战之接口实现与方法集
    Python的Matplotlib库:数据可视化的利器
    JavaScript 继承 - ES6的class继承用ES5如何实现?
    电力电子转战数字IC20220824day68——uvm实战3
    Leetcoder Day29| 贪心算法part03
    kibana操作es使用DSL查询
    Lua类型系统详解(一)
    Vue3路由守卫、vuex的使用、vuex模块化拆分、vite中自动导入模块文件
  • 原文地址:https://www.cnblogs.com/mic112/p/16306067.html