java并发编程面试

文章目录

            • 1.为什么要使用线程池?
            • 2.你们哪些地方会使用到线程池?
            • 3.线程池有哪些作用?
            • 4.线程池的创建方式?
            • 5.线程池底层是如何实现复用的?
            • 6.ThreadPoolExecutor 核心参数有哪些 ?
            • 7.线程池创建的线程会一直在运行状态吗?
            • 9.线程池底层 ThreadPoolExecutor 底层实现原理
            • 10.线程池队列满了,任务会丢失吗 ?
            • 11.线程池如何合理配置参数 ?

1.为什么要使用线程池?

因为频繁的开启线程或者停止线程, 线程需要重新被 CPU 从就绪到运行状态调度, 需要发生CPU 的上下文切换, 效率非常低。
在这里插入图片描述

2.你们哪些地方会使用到线程池?

实际开发项目中 禁止自己 new 线程,使用线程池来统一维护管理。
案例分享:

项目中异步发邮件和发短信就是用到了多线程,但是呢,我们自己如果通过new thread线程异步的去发短信或者邮件,这样会存在隐患,导致线程没有使用到线程池进行维护和统一管理。因此,我们采用线程池的方案,使用springboot整合线程池,实现异步发短信或者邮件。当项目比较小时可以采用此方案,如果,项目比较大做异步时,建议采用使用MQ异步。

3.线程池有哪些作用?

核心点: 复用机制 提前创建好固定的线程一直在运行状态 实现复用 限制线程创建数量

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

4.线程池的创建方式?

首先线程池的创建方式,我们可以通过JDK原生自带的方式Executors,提供了4个API,有可缓存线程池、可定长度线程池、可定时线程池、单例线程池;但是非常遗憾,阿里巴巴java开发手册他不推荐我们使用JDK源码中自带的线程池,为什么呢,因为,我们的线程池底层都是基于 ThreadPoolExecutor 构造函数封装的,而 ThreadPoolExecutor构造函数中,底层都是采用无界队列缓存我们的任务的,会无限缓存任务容易发生内存溢出,会导致我们最大线程数会失效。

Executors.newCachedThreadPool(); 可缓存线程池
Executors.newFixedThreadPool(); 可定长度 限制最大线程数
Executors.newScheduledThreadPool() ; 可定时
Executors.newSingleThreadExecutor(); 单例
底层都是基于 ThreadPoolExecutor 构造函数封装

5.线程池底层是如何实现复用的?

本质思想:创建一个线程,不会立马停止或者销毁而是一直实现复用。

  1. 提前创建固定大小的线程且一直保持在正在运行状态;(可能会非常消耗 cpu 的资源)
  2. 当需要线程执行任务,将该任务提交缓存在并发队列中;如果缓存队列满了,则会执行拒绝策略;
    1. 正在运行的线程从并发队列中获取任务执行,从而实现多线程复用
6.ThreadPoolExecutor 核心参数有哪些 ?

corePoolSize:核心线程数量 一直正在保持运行的线程
maximumPoolSize:最大线程数,线程池允许创建的最大线程数。
keepAliveTime:超出 corePoolSize 后创建的线程的存活时间。
unit:keepAliveTime 的时间单位。
workQueue:任务队列,用于保存待执行的任务。
threadFactory:线程池内部创建线程所用的工厂。
handler:任务无法执行时的处理器。

7.线程池创建的线程会一直在运行状态吗?

不会
例如:配置核心线程数 corePoolSize 为 2 、最大线程数 maximumPoolSize 为 5, 我们可以通过配置超出 corePoolSize 核心线程数后创建的线程的存活时间,例如为 60s, 在 60s 内没有核心线程一直没有任务执行,则会停止该线程。
8.为什么阿里巴巴不建议使用 Executors ?
因为默认的 Executors 线程池底层是基于 ThreadPoolExecutor 构造函数封装的,采用无界队列存放缓存任务,会无限缓存任务容易发生内存溢出,会导致我们最大线程数会失效。
内存溢出与最大线程数会失效:

源码中,多线程缓存队列采用的是LinkedBlockingQueue,而LinkedBlockingQueue的缓存队列大小是无界的(Integer.MAX_VALUE),缓存队列中会一直会有新的线程加入进来,当达到服务器的瓶颈时,就会发生内存溢出。最大线程数开启的前提是缓存队列容量慢的时候,采用开启最大线程数。
在这里插入图片描述
在这里插入图片描述

9.线程池底层 ThreadPoolExecutor 底层实现原理

在这里插入图片描述

10.线程池队列满了,任务会丢失吗 ?

在这里插入图片描述

11.线程池如何合理配置参数 ?

自定义线程池就需要我们自己配置最大线程数 maximumPoolSize,为了高效的并发运行,当 然这个不能随便设置。这时需要看我们的业务是 IO 密集型还是 CPU 密集型。

CPU 密集型 CPU 密集的意思是该任务需要大量的运算,而没有阻塞,CPU 一直全速运行。CPU 密集任 务只有在真正的多核 CPU 上才可能得到加速(通过多线程),而在单核 CPU 上,无论你开几 个模拟的多线程该任务都不可能得到加速,因为 CPU 总的运算能力就那些。

CPU 密集型任务配置尽可能少的线程数量:以保证每个 CPU 高效的运行一个线程。

一般公式:(CPU 核数+1)个 线程的线程池

IO 密集型

I0 密集型,即该任务需要大量的 IO,即大量的阻塞。在单线程上运行 I0 密集型的任务会导 致浪费大量的 CPU 运算能力浪费在等待。 所以在 IO 密集型任务中使用多线程可以大大的加速程序运行,即使在单核 CPU 上,这种加 速主要就是利用了被浪费掉的阻塞时间。

I0 密集型时,大部分线程都阻寒,故需要多配置线程数:

公式: CPU 核数 * 2 CPU 核数 / (1 - 阻塞系数) 阻塞系数 在 0.8~0.9 之间

查看 CPU 核数: System.out.println(Runtime.getRuntime().availableProcessors());

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/515928.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

下一代云原生应用制品管理平台,容器镜像服务企业版优惠进行时

随着越来越多的企业拥抱容器、拥抱云原生技术,享受技术带来的弹性、敏捷、可移植的便利,但是在实现容器技术生产落地时,很难规避以下痛点问题: 1、 运维复杂度:需要自建一个高可用的镜像服务去面对峰值流量…

软件设计师 - 系统测试

软件测试的目的:发现尽可能多的缺陷,而不是为了证明软件的正确性; 白盒测试: 语句覆盖每个可执行语句都被执行到判定覆盖(分支覆盖)每个语句至少执行一次,且每个判定的可能结果都至少执行一次条…

开放下载!《OSS运维基础实战手册》

作为一名云运维工程师,在攻克OSS的道路上难免会遇到"天花板"。放轻松,《OSS运维基础实战手册》帮你轻松解决!本书透彻解析OSS核心概念,十二心法打开全新运维视角,力求帮助云运维工程师们打破能力上升瓶颈。 …

MQ相关面试题

文章目录你们项目中哪些地方有使用到 MQ ?为什么需要使用 MQ?MQ 如何避免消息堆积的问题?MQ 宕机了消息是否会丢失呢?生产者投递消息,MQ 宕机了如何处理?MQ 如何保证消息顺序一致性问题?为什么保证了消息顺…

终于要跟大家见面了,Flink 面试指南

面试,一个令人大多数同学头疼的问题,要么成功进入心仪公司,要么沮丧与其失之交臂。但是,如果能在面试前就能知道面试官将会问的问题,然后可以好好提前准备,这种感觉是不是特别棒? 之前社区帮大…

云转型谈何容易?打破转型阵痛,汇量科技加码云原生

作者 | 伍杏玲出品 | CSDN云计算10 年前,Netscape 创始人、硅谷著名投资人马克安德森表示“软件正在吞噬世界”,这只说了故事的一半,10 年过去,人们从不信任到得“云”者得天下,云服务成为正在吞噬世界的“大鱼”。工业…

SpingBoot 整合 kafka Elk

文章目录1. 依赖2. yml配置3. 测试类4. aop拦截5. 并发队列异步发送MQ6. 封装json消息7. 完整封装json消息1. 依赖 <dependencies><dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId></…

如何用一套引擎搞定机器学习全流程?

作者:陈戊超&#xff08;仲卓&#xff09; 深度学习技术在当代社会发挥的作用越来越大。目前深度学习被广泛应用于个性化推荐、商品搜索、人脸识别、机器翻译、自动驾驶等多个领域&#xff0c;此外还在向社会各个领域迅速渗透。 背景 当前&#xff0c;深度学习的应用越来越多…

分布式解决方案之分布式日志采集elk+kafka 环境的构建

文章目录一、软件下载列表1. zookeeper2. kafka3. logstash4. elasticsearch5. kibana6. zktools二、安装zk环境2.1. 上传安装包2.2. 解压2.3. 创建data目录2.4. 修改配置2.5.启动zk三、安装kafka环境3.1. 上传安装包3.2. 解压kafka安装包3.3. 创建data文件夹3.4. 修改配置3.5.…

基于https国密算法构建安全数据传输链路

网络数据安全得到前所未有的重视 HTTPS成为解决传输安全问题利器 大家都知道&#xff0c;HTTP 本身是明文传输的&#xff0c;没有经过任何安全处理&#xff0c;网站HTTPS解决方案通过在HTTP协议之上引入证书服务&#xff0c;完美解决网站的安全问题。 下图左侧表示Chrome浏览…

AOP+自定义注解 实现service统一的异常信息处理

返回信息枚举 TipsMsg&#xff1a; public enum TipsMsg {DEFAULT_SUCCESS("0","操作成功"),DEFAULT_FAILED("1","操作失败"),//其他枚举//get//set}自定义注解 ReturnMsg &#xff08;也是切点&#xff09; &#xff1a; Target(El…

跟风 Python 的人,后来都怎样了?

许多人觉得 Python 功能强大、就业范围范围广还上手轻松&#xff0c;得来全部费功夫。 但是一旦推开 Python 的大门你会发现&#xff0c;Python 入门容易但精通很难。看似语法掌握熟练&#xff0c;但一面试或者做项目就会被打回原形。 比如&#xff1a; 1&#xff09;如何写出高…

Kubernetes 是一个“数据库”吗?

作者 | 张磊&#xff0c;阿里云高级技术专家、CNCF 官方大使&#xff0c;CNCF 应用交付领域 co-chair&#xff0c;Kubernetes 项目资深维护者 最近&#xff0c;Kubernetes 社区里有一个关于“Kubernetes is the new database”的论述&#xff0c;引起了很多人的关注。当然&…

云原生下的开发测试

【以下为分享实录&#xff0c;有删节】 测试环境管理之困与阿里巴巴的解决之道 在云原生时代下&#xff0c;软件的迭代速度越来越快&#xff0c;对测试的要求也越来越高&#xff0c;很多开发者开始使用Kubernetes来管理测试环境。在这个过程中&#xff0c;开发者会遇到很多困…

我是程序员,我用这种方式铭记历史

作者 | kokohuang责编 | 晋兆雨头图 | 付费下载于视觉中国✨抗战直播: 以图文方式“直播”1931年9月18日至1945年9月2日14年间抗战的日日夜夜✨开源地址&#xff1a;https://github.com/kokohuang/WarOfResistanceLive✨预览地址&#xff1a;https://kokohuang.github.io/WarOf…

分布式ELK日志采集系统

文章目录1. 传统日志采集存在哪些优缺点2. Elk采集日志的原理3. 为什么需要将日志存储在ElasticSeach 而不是mysql中呢4. 为什么需要使用elkkafka5. elkkafka原理6. elkkafka 环境的构建7. SpingBoot 整合 kafka Elk1.传统日志采集存在哪些问题2.分布式日志采集有哪些方案3.Ela…

从零入门 Serverless | 架构的演进

作者 | 许晓斌 阿里云高级技术专家 本文整理自《Serverless 技术公开课》第 1 讲&#xff0c;点击开始学习。 关注 “Serverless” 公众号&#xff0c;回复 入门 &#xff0c;即可获取 Serverless 系列文章 PPT。 传统单体应用架构 十多年前主流的应用架构都是单体应用&…

如何使用 Istio 进行多集群部署管理:多控制平面

作者 | 王夕宁 阿里云高级技术专家 导读&#xff1a;本文摘自于阿里云高级技术专家王夕宁撰写的《Istio 服务网格技术解析与实战》一书&#xff0c;讲述了如何使用 Istio 进行多集群部署管理来阐述服务网格对多云环境、多集群即混合部署的支持能力。 前文详情&#xff1a; …

JDK8新特性入门到精通

文章目录一、 接口中默认方法修饰为普通方法1. 在jdk8之前2. 在JDK 1.8开始3. 案例演练二、Lambda表达式2.1. 什么是Lambda表达式2.2. 为什么要使用Lambda表达式2.3. Lambda表达式的规范2.4. 函数接口定义2.5. Lambda基础语法2.6. 方法引入2.7. Lambda实战案例三、java 8 strea…

一文聊“图”,从图数据库到知识图谱

作者 | 穆琼责编 | 晋兆雨头图 | 付费下载于视觉中国随着知识图谱的发展&#xff0c;图数据库一词被越来越多的提到。那么到底什么是图数据库&#xff0c;为什么要用图数据库&#xff0c;如何去建设一个图数据库应用系统&#xff0c;图数据库与知识图谱到底是什么关系。今天为大…