栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

好友添加:huany6880 加入资深Java学习交流圈,并有系统整理了一套java初学/进阶者最佳的学习方法以及路线图大纲,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。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/874673.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号