线程池面试题有哪些?线程池面试常见问题

对于程序员来说,线程池肯定不会觉得陌生,因为在面试的时候总会提到关于线程池的问题,并且这也是面试必问的知识点,所以为了能够让大家顺利java面试,今天我们就给大家分享一些线程池面试常见问题!

1.线程池的工作原理是什么?

当线程池中的线程数量小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程;

当线程池中的线程数量达到corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行;

当workQueue已满,且MaximumPoolSize>CorePoolSize时,新提交的任务会创建新的非核心线程执行任务;

当并且队列已满,并且提交任务数超过maximumPoolSize时,新提交任务由RejectedExecutionHandler处理;

当一个线程完成任务时,它会从队列中取下一个任务来执行。

当线程池中超过corePoolSize线程,空闲时间达到keepAliveTime时,关闭空闲的非核心线程,最终线程池中的线程数量会收缩到corePoolSize的大小.

当设置allowCoreThreadTimeOut(true)时,线程池中corePoolSize线程空闲时间达到keepAliveTime也将关闭。

注意:线程池将任务存入工作队列的时候调用的是BlockQueue的非阻塞方法offer(E e),因为工作队列满并不会使提交任务的客户端线程暂停。

2.如果你提交任务时,线程池队列已满,这时会发生什么?

如果使用的是无界队列LinkedBlockingQueue,也就是无界队列的话,没关系,继续添加任务到阻塞队列中等待执行,因为LinkedBlockingQueue可以近乎认为是一个无穷大的队列,可以无限存放任务.

如果使用的是有界队列比如ArrayBlockingQueue,任务首先会被添加到ArrayBlockingQueue中,ArrayBlockingQueue满了,会根据maximumPoolSize的值增加线程数量,如果增加了线程数量还是处理不过来,ArrayBlockingQueue继续满,那么则会使用拒绝策略RejectedExecutionHandler处理满了的任务,默认是AbortPolicy.

3.为什么要用线程池?

(1)降低资源消耗

我们知道,线程在java堆里面是一个对象,也是操作系统的一部分资源,线程创建、销毁需要时间。如果创建线程加上销毁的时间大于执行任务的时间就很不划算了。所以,线程池通过重复利用已创建的线程降低线程创建和销毁造成的消耗。

java对象占用堆内存,操作系统线程占用系统的内存,根据JVM虚拟机的规范,一个线程默认最大的是1M,我们可以通过-xss去修改,这个栈空间是需要内存分配的,线程的增加,必然增加内存的消耗,所以线程不是越多越好。

(2)提高响应速度

当任务到达时,任务可以不需要等到线程创建就能立即执行。

(3)提高线程的可管理性

线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。但是,要做到合理利用线程池,必须对其实现原理了如指掌。

4.使用无界队列的线程池会导致什么问题吗?

例如newFixedThreadPool使用了无界的阻塞队列LinkedBlockingQueue,如果线程获取一个任务后,任务的执行时间比较长,会导致队列的任务越积越多,导致机器内存使用不停飙升,最终导致OOM。

关于java线程池的知识点建议大家一定要掌握,因为这是java重点知识,也是面试中必问的,如果将这些知识点掌握好,也是能够提高面试通过机率的!最后大家如果想要了解更多Java面试题知识,敬请关注奇Q工具网。

推荐阅读:

git客户端怎么更换账号?git如何创建仓库?

json格式如何存入mysql?存入方法介绍

ajax如何解决跨域问题?前端ajax跨域解决方案