美文网首页面试
美团一面总结

美团一面总结

作者: 王勇1024 | 来源:发表于2021-06-25 14:27 被阅读0次

    线程池的实现原理

    参考: Java线程池实现原理及其在美团业务中的实践

    线程池是什么

    线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。

    线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机的整体性能。线程池维护多个线程,等待监督管理者分配可并发执行的任务。这种做法,一方面避免了处理任务时创建销毁线程开销的代价,另一方面避免了线程数量膨胀导致的过分调度问题,保证了对内核的充分利用。

    当然,使用线程池可以带来一系列好处:

    • 降低资源消耗:通过池化技术重复利用已创建的线程,降低线程创建和销毁造成的损耗。
    • 提高响应速度:任务到达时,无需等待线程创建即可立即执行。
    • 提高线程的可管理性:线程是稀缺资源,如果无限制创建,不仅会消耗系统资源,还会因为线程的不合理分布导致资源调度失衡,降低系统的稳定性。使用线程池可以进行统一的分配、调优和监控。
    • 提供更多更强大的功能:线程池具备可拓展性,允许开发人员向其中增加更多的功能。比如延时定时线程池ScheduledThreadPoolExecutor,就允许任务延期执行或定期执行。

    线程池解决的问题是什么

    线程池解决的核心问题就是资源管理问题。在并发环境下,系统不能够确定在任意时刻中,有多少任务需要执行,有多少资源需要投入。这种不确定性将带来以下若干问题:

    • 频繁申请/销毁资源和调度资源,将带来额外的消耗,可能会非常巨大。
    • 对资源无限申请缺少抑制手段,易引发系统资源耗尽的风险。
    • 系统无法合理管理内部的资源分布,会降低系统的稳定性。

    线程池核心设计与实现

    ThreadPoolExecutor运行流程

    线程池在内部实际上构建了一个生产者消费者模型,将线程和任务两者解耦,并不直接关联,从而良好的缓冲任务,复用线程。线程池的运行主要分成两部分:任务管理、线程管理。任务管理部分充当生产者的角色,当任务提交后,线程池会判断该任务后续的流转:(1)直接申请线程执行该任务;(2)缓冲到队列中等待线程执行;(3)拒绝该任务。线程管理部分是消费者,它们被统一维护在线程池内,根据任务请求进行线程的分配,当线程执行完任务后则会继续获取新的任务去执行,最终当线程获取不到任务的时候,线程就会被回收。

    BIO和NIO的区别

    参考:10个最高频的Java NIO面试题剖析!

    BIO NIO
    同步阻塞式 同步非阻塞式
    面向流 面向缓冲区
    适用于单线程环境 适用于多线程环境
    实现简单 实现复杂
    性能差 性能好
    每个客户端连接需要一个处理线程,不支持海量连接 多路复用,支持海量连接
    Reactor模型
    Socket/ServerSocket Buffer/SocketChannel/Selector/SelectionKey

    BIO模型图

    BIO模型图

    NIO模型图

    NIO模型图

    Reactor模型图

    Reactor模型图

    相关文章

      网友评论

        本文标题:美团一面总结

        本文链接:https://www.haomeiwen.com/subject/swhcaktx.html