【面试必备】我跟面试官聊了一个小时线程池!

大家好,这篇文章主要跟大家聊下 Java 线程池面试中可能会问到的一些问题。

全程干货,耐心看完,你能轻松应对各种线程池面试。

相信各位 Javaer 在面试中或多或少肯定被问到过线程池相关问题吧,线程池是一个相对比较复杂的体系,基于此可以问出各种各样、五花八门的问题。

若你很熟悉线程池,如果可以,完全可以滔滔不绝跟面试官扯一个小时线程池,一般面试也就一个小时左右,那么这样留给面试官问其他问题的时间就很少了,或者其他问题可能问的也就不深入了,那你通过面试的几率是不就更大点了呢。

下面我们开始列下线程池面试可能会被问到的问题以及该怎么回答,以下只是参考答案,你也可以加入自己的理解。

1. 面试官:日常工作中有用到线程池吗?什么是线程池?为什么要使用线程池?

一般面试官考察你线程池相关知识前,大概率会先问这个问题,如果你说没用过,不了解,ok,那就没以下问题啥事了,估计你的面试结果肯定也凶多吉少了。

作为 JUC 包下的门面担当,线程池是名副其实的 JUC 一哥,不了解线程池,那说明你对 JUC 包其他工具也了解的不咋样吧,对 JUC 没深入研究过,那就是没掌握到 Java 的精髓,给面试官这样一个印象,那结果可想而知了。

所以说,这一分一定要吃下,那我们应该怎么回答好这问题呢?

可以这样说:

计算机发展到现在,摩尔定律在现有工艺水平下已经遇到难易突破的物理瓶颈,通过多核 CPU 并行计算来提升服务器的性能已经成为主流,随之出现了多线程技术。

线程作为操作系统宝贵的资源,对它的使用需要进行控制管理,线程池就是采用池化思想(类似连接池、常量池、对象池等)管理线程的工具。

JUC 给我们提供了 ThreadPoolExecutor 体系类来帮助我们更方便的管理线程、并行执行任务。

下图是 Java 线程池继承体系:

使用线程池可以带来以下好处:

  1. 降低资源消耗。降低频繁创建、销毁线程带来的额外开销,复用已创建线程

  2. 降低使用复杂度。将任务的提交和执行进行解耦,我们只需要创建一个线程池,然后往里面提交任务就行,具体执行流程由线程池自己管理,降低使用复杂度

  3. 提高线程可管理性。能安全有效的管理线程资源,避免不加限制无限申请造成资源耗尽风险

  4. 提高响应速度。任务到达后,直接复用已创建好的线程执行

线程池的使用场景简单来说可以有:

  1. 快速响应用户请求,响应速度优先。比如一个用户请求,需要通过 RPC 调用好几个服务去获取数据然后聚合返回,此场景就可以用线程池并行调用,响应时间取决于响应最慢的那个 RPC 接口的耗时;又或者一个注册请求,注册完之后要发送短信、邮件通知,为了快速返回给用户,可以将该通知操作丢到线程池里异步去执行,然后直接返回客户端成功,提高用户体验。

  2. 单位时间处理更多请求,吞吐量优先。比如接受 MQ 消息,然后去调用第三方接口查询数据,此场景并不追求快速响应,主要利用有限的资源在单位时间内尽可能多的处理任务,可以利用队列进行任务的缓冲


 

 

2. 面试官:ThreadPoolExecutor 都有哪些核心参数?

其实一般面试官问你这个问题并不是简单听你说那几个参数,而是想要你描述下线程池执行流程。

青铜回答:

包含核心线程数(corePoolSize)、最大线程数(maximumPoolSize),空闲线程超时时间(keepAliveTime)、时间单位(unit)、阻塞队列(workQueue)、拒绝策略(handler)、线程工厂(ThreadFactory)这7个参数。

钻石回答:

回答完包含这几个参数之后,会再主动描述下线程池的执行流程,也就是 execute() 方法执行流程。

execute()方法执行逻辑如下:


 

public void execute(Runnable command) {
    if (command == null)
        throw new NullPointerException();
    int c = ctl.get();
    if (workerCountOf(c) < corePoolSize) {
        if (addWorker(command, true))
            return;
        c = ctl.get();
    }
    if (isRunning(c) && workQueue.offer(command)) {
        int recheck = ctl.get();
        if (! isRunning(recheck) && remove(command))
            reject(command);
        else if (workerCountOf(recheck) == 0)
            addWorker(null, false);
    }
    else if (!addWorker(command, false))
        reject(command);
}

可以总结出如下主要执行流程,当然看上述代码会有一些异

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,那我就开始对你进行Java面试了。 1. 讲一下Java中的多态性是什么? Java中的多态性指的是不同的对象可以对同一消息做出不同的响应。Java实现多态性的方式有两种:方法重载和方法重写。方法重载指的是在同一个类中定义多个方法,这些方法具有相同的名字,但是参数列表不同。方法重写指的是在子类中重新定义父类中已经定义的方法,使得子类对象可以对该方法做出不同的响应。 2. 说一下Java中的异常处理机制? Java中的异常处理机制是通过try-catch-finally语句块来实现的。当有异常产生时,程序会跳转到对应的catch块进行处理,如果catch块中没有处理该异常的代码,则会抛出该异常给上层调用者处理。finally块中的代码会在try-catch块中的代码执行完毕后执行,无论是否有异常产生。 3. 什么是Java中的垃圾回收机制? Java中的垃圾回收机制指的是自动回收不再被使用的对象所占用的内存空间。Java中的垃圾回收机制通过JVM来实现,JVM会定期扫描程序中的对象,找出不再被引用的对象并释放它们占用的内存空间。Java中的垃圾回收机制可以提高程序的运行效率和可靠性,但也会占用一定的系统资源。 4. 什么是Java中的反射? Java中的反射指的是在程序运行时动态获取对象的信息和操作对象的属性和方法。Java中的反射机制可以使得程序在运行时动态创建对象、调用方法和修改属性等,可以提高程序的灵活性和可扩展性。但是Java中的反射机制会降低程序的运行效率,并且容易破坏程序的封装性和安全性。 5. 请简述Java中的线程同步机制? Java中的线程同步机制指的是通过同步锁来实现多个线程对共享资源的互斥访问。Java中的同步锁可以通过synchronized关键字来实现,也可以通过Lock接口的实现类来实现。当一个线程获取了同步锁后,其他线程必须等待该线程释放锁后才能继续访问共享资源。Java中的线程同步机制可以保证共享资源的正确性和可靠性,但也会降低程序的并发性能和响应速度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值