【Java 面试题合集】ThreadPoolExecutor 线程池面试题

news2024/9/24 5:27:20

文章目录

  • 自定义的线程池的 7 个参数
  • 如何合理设置核心线程数 corePoolSize 的大小
    • 《JAVA 并发编程实战》中的方案
  • java 开发手册中为什么不允许使用 Executors 默认的实现?
  • 一个线程池中的线程异常了,那么线程池会怎么处理这个线程?
  • 线程池被创建后里面有线程吗?有什么方法对线程池进行预热吗?
  • submit 和 execute 两个方法有什么区别?
  • shutdownNow() 和 shutdown() 两个方法有什么区别?
  • 调用了 shutdownNow 或者 shutdown,线程一定会退出么?
  • 为什么线程池要使用阻塞队列?
  • 线程池扩展

博主其他 ThreadPoolExecutor 线程池相关文章传送门:
《ThreadPoolExecutor源码解析》
《JDK8 ThreadPoolExecutor 线程池源码深度解析(附几种线程池的扩展方式)》
《java 线程池 ThreadPoolExecutor 源码扩展 支持先增加非核心线程处理任务后放任务队列

自定义的线程池的 7 个参数

maximumPoolSize 最大线程数
keepAliveTime 存活时间
unit 时间单位
workQueue 存放待执行任务的队列
threadFactory 创建线程的工厂。创建线程或线程池时指定有意义的线程名称,方便出错时回溯。
handler 拒绝策略

项目中,我们会使用简单的线程隔离的方案,每个业务使用一个线程池。

如何合理设置核心线程数 corePoolSize 的大小

这个是要根据具体的业务来决定的,如果是「CPU 密集型任务」:比如像加解密,压缩、计算等一系列需要大量耗费 CPU 资源的任务,大部分场景下都是纯 CPU 计算。尽量使用较小的线程池,一般为 CPU 核心数+1。因为 CPU 密集型任务使得 CPU 使用率很高,若开过多的线程数,会造成 CPU 过度切换。如果是「IO 密集型任务」:比如像 MySQL 数据库、文件的读写、网络通信等任务,这类任务不会特别消耗 CPU 资源,但是 IO 操作比较耗时,会占用比较多时间。可以使用稍大的线程池,一般为 2 * CPU 核心数。IO 密集型任务 CPU 使用率并不高,因此可以让 CPU 在等待 IO 的时候有其他线程去处理别的任务,充分利用 CPU 时间。

《JAVA 并发编程实战》中的方案

CPU 密集型:核心数 + 1(即使当计算(CPU)密集型的线程偶尔由于页缺失故障或者其他原因而暂停时,这个“额外”的线程也能确保 CPU 的时钟周期不会被浪费。)
IO 密集型:
在这里插入图片描述

java 开发手册中为什么不允许使用 Executors 默认的实现?

FixedThreadPool 和 SingleThreadPool 的 workQueue 长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。
CachedThreadPool 的 maximumPoolSize 数量为 Integer.MAX_VALUE,可能会创建大量的线程,从而导致 OOM。

public static ExecutorService newFixedThreadPool(int nThreads) {  
    return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS,  
                                  new LinkedBlockingQueue<Runnable>());  
}

public static ExecutorService newSingleThreadExecutor() {  
    return new FinalizableDelegatedExecutorService  
        (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,  
                                new LinkedBlockingQueue<Runnable>()));  
}

public static ExecutorService newCachedThreadPool() {  
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS,  
                                  new SynchronousQueue<Runnable>());  
}

一个线程池中的线程异常了,那么线程池会怎么处理这个线程?

  1. 当执行方式是 execute 时,可以看到堆栈异常的输出。
  2. 当执行方式是 submit 时,堆栈异常没有输出。但是调用 Future.get()方法时,可以捕获到异常。
  3. 不会影响线程池里面其他线程的正常执行。
  4. 线程池会把这个线程移除掉,并创建一个新的线程放到线程池中。

线程池被创建后里面有线程吗?有什么方法对线程池进行预热吗?

线程池被创建后如果没有任务过来,里面是不会有线程的。如果需要预热的话可以调用下面的两个方法:prestartAllCoreThreads() 和 prestartCoreThread()。

    // Starts all core threads.
    public int prestartAllCoreThreads() {
        int n = 0;
        while (addWorker(null, true))
            ++n;
        return n;
    }

    // Starts a core thread.
    public boolean prestartCoreThread() {
        return workerCountOf(ctl.get()) < corePoolSize &&
            addWorker(null, true);
    }

submit 和 execute 两个方法有什么区别?

submit() 和 execute() 都可以往线程池中提交任务,区别是使用 execute() 执行任务无法获取到任务执行的返回值,而使用 submit()方法, 可以使用 Future 来获取任务执行的返回值。

shutdownNow() 和 shutdown() 两个方法有什么区别?

shutdownNow() 和 shutdown() 都是用来终止线程池的,它们的区别是,使用 shutdown() 程序不会报错,也不会立即终止线程,它会等待线程池中的缓存任务执行完之后再退出,执行了 shutdown() 之后就不能给线程池添加新任务了;shutdownNow() 会试图立马停止任务,线程中的任务不会再执行,也无法添加新的任务。

调用了 shutdownNow 或者 shutdown,线程一定会退出么?

这个是不一定的,因为线程池会调用线程的 interrupt() 来中断线程的执行,但是这个方法不会打断正在运行的线程,只对正在阻塞等待的线程生效,一旦线程执行的任务类似于一个死循环,那么任务永远不会执行完,那么线程永远都不会退出。

为什么线程池要使用阻塞队列?

因为线程一旦任务执行完之后,如果想让线程不退出,只能阻塞或者自旋来保证线程不会退出,阻塞会让 cpu 资源,但是自旋不会,所以为了防止线程退出和减少 cpu 的消耗,选择使用阻塞队列来保证线程不会退出。

线程池扩展

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

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

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

相关文章

OpenCV——总结《图像处理-1》

1.HSV H - 色调&#xff08;主波长&#xff09;。S - 饱和度&#xff08;纯度/颜色的阴影&#xff09;。V值&#xff08;强度&#xff09; hsvcv2.cvtColor(img,cv2.COLOR_BGR2HSV)2.图像阈值 函数介绍&#xff1a; ret, dst cv2.threshold(src, thresh, maxval, type) sr…

嵌入式Linux从入门到精通之第九节:系统编程

系统编程概述 在讲解系统编程之前,先了解几个概念: 操作系统的作用: 操作系统用来管理所有的资源,并将不同的设备和不同的程序关联起来。 什么是Linux系统编程? 在有操作系统的环境下编程,并使用操作系统提供的系统调用及各种库,对系统资源进行访问。 学会了C语言再知…

Grafana9.3.x在windows上的安装及使用

Grafana9.3.x的安装及使用1. Grafana install1.1 Download1.2 Install2. User Guide1.1 Document1.2 Table视图背景色渲染3.Awakening1. Grafana install 1.1 Download 下载地址 Grafana Website: https://grafana.com/. 1.2 Install 直接点击安装就好了 进入conf目录复制一…

python集合语法与应用

python集合语法与应用 文章目录python集合语法与应用一、实验目的二、实验原理三、实验环境四、实验内容五、实验步骤1.创建2.增加3.删除4.集合运算5.拓展知识一6.拓展知识二总结一、实验目的 掌握集合的用法 二、实验原理 集合中只能包含数字、字符串、元组等不可变的类型的…

规则引擎,实现业务低代码开发的重要工具

规则引擎&#xff0c;是将业务执行抽象化的配置&#xff0c;通过其定义的数据结构、算法和流程来实现应用程序功能的普适化。 规则引擎可以帮助企业提高业务开发效率&#xff0c;提高运营的灵活性&#xff0c;降低运营成本与开发成本&#xff0c;让系统更加智能化灵活化。这里以…

【Rust】5. 所有权

5. 所有权 5.1 什么是所有权 5.1.1 栈&#xff08;Stack&#xff09;与堆&#xff08;Heap&#xff09; 5.1.2 所有权规则 5.1.3 变量作用域 5.1.4 String 类型 String 类型可进行修改&#xff0c;而字符串字面值是不可以的&#xff01;&#xff08;区别在于二者对内存的处理…

OAuth2

目录一、什么是OAuth2.0二、OAuth2中的角色三、认证流程四、生活中的Oauth2思维5. 令牌的特点6.OAuth2授权方式6.1 授权码6.2 隐藏方式6.3 密码方式6.4 凭证方式一、什么是OAuth2.0 OAuth2.0是目前使用非常广泛的授权机制&#xff0c;用于授权第三方应用获取用户的数据。 举例…

PythonWeb Django框架学习笔记

文章目录Django一、初步了解Django1.1 创建项目1.2 文件介绍1.3 APP的创建和说明添加新的app注册app创建页面1.4 templates模板templates语法单一变量列表循环【列表】字典循环【字典】列表套字典条件判断templates小结1.5 请求和响应案例&#xff1a;用户管理二、数据库操作2.…

前言技术之mybatis-plus 01

目录 1.什么是mybatis-plus 2.初体验 3.日志 4.主键生成策略 5.更新 6.自动填充 1.什么是mybatis-plus 升级版的mybatis&#xff0c;目的是让mybatis更易于使用&#xff0c; 用官方的话说“为简化而生” 官网&#xff1a; MyBatis-Plus 2.初体验 1.准备数据库脚本 数据…

再获殊荣!天云数据入选第一批北京市级企业技术中心,Hubble数据库提供新一代信息技术科技服务

为助力北京国际科技创新中心建设&#xff0c;贯彻落实北京市“十四五”时期高精尖产业发展规划&#xff0c;引导和支持企业加强创新能力&#xff0c;培育和引导企业技术中心建设&#xff0c;北京市经济和信息化局组织开展了2022年度第一批北京市市级企业技术中心的创建工作&…

【Python学习笔记】5. Python3 基本数据类型(上)——数值型、字符串型

前言 Python 中的变量不需要声明。每个变量在使用前都必须赋值&#xff0c;变量赋值以后该变量才会被创建。 Python3 基本数据类型 Python 中的变量不需要声明。每个变量在使用前都必须赋值&#xff0c;变量赋值以后该变量才会被创建。 在 Python 中&#xff0c;变量就是变…

tomcat配置多个host,并且避免重复加载

目录 1.实验描述 2.实验环境 2.实验过程 2.1 创建order和user项目 2.2 打包项目 2.3 修改tomcat的server.xml的配置 2.4 启动tomcat 2.5 配置本地host 2.6 验证 1.实验描述 目前有两个域名&#xff0c;分别是&#xff1a; order.abc.com user.abc.com 两个项目&…

微信小程序学习第1天:微信小程序开发入门介绍

前言&#xff1a;微信小程序开发模式 1、申请小程序开发账号 2、安装小程序开发者工具 3、创建和配置小程序项目 一、申请小程序开发账号 1、体验小程序 2、注册小程序开发账号 使用浏览器打开https://mp.weixin.qq.com网址&#xff0c;按照提示注册 注册承购后&#xff0c…

微服务 初始 分布式搜索引擎 Elastic Search

文章目录⛄引言一、什么是Elastic Search&#xff1f;二、Elastic Search 倒排索引⛅正向索引⚡倒排索引⛄正向和倒排三、ES的一些概念⛅文档和字段⚡索引和映射四、MySQL 与 Elasticsearch⛵小结⛄引言 本文参考黑马 分布式Elastic search Elasticsearch是一款非常强大的开源…

OBB的计算python实现

OBB的计算python实现1. 实现步骤步骤① 分解点集的xyz分量步骤② 对x、y、z这三个随机变量&#xff08;一维数组&#xff09;求协方差矩阵步骤③ 对步骤②中的协方差矩阵求解特征值与特征向量&#xff0c;特征向量构造列向量矩阵M步骤④ 将点集的几何中心平移至坐标系原点&…

最全java面试题及答案(208道)

本文分为十九个模块&#xff0c;分别是&#xff1a;「Java 基础、容器、多线程、反射、对象拷贝、Java Web 、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM」 &#xff0c;如下图所…

Discord怎么抢白名单?Discord多账号防关联可以提高白名单成功率

Discord作为一个社交媒体&#xff0c;在加密货币领域扮演着重要的角色&#xff0c;它强大而便捷。更重要的是&#xff0c;如果你是一个投资者&#xff0c;Discord无疑是你了解项目动态&#xff0c;深入社区沟通交流的重要工具。 相信很多玩NFT和Web3的朋友都不会对discord 陌生…

分位数的理解与查询

目录 分位数的定义与理解&#xff1a; pyspark 中分位数查询 方式1 &#xff1a; 某列分位数查询&#xff1a; 采用dataframe的approxQuantile属性&#xff0c;返回一个list 例子&#xff1a; 方式2 &#xff1a; 转换为toPandas&#xff0c;利用pandas.dataframe利的…

全志T113-i+玄铁HiFi4开发板硬件说明书(2)

前 言 本文档主要介绍开发板硬件接口资源以及设计注意事项等内容,测试板卡为全志T113-i+玄铁HiFi4开发板,由于篇幅问题,本篇文章共分为上下两集,点击账户可查看更多内容详情,开发问题欢迎留言,感谢关注。 T113-i处理器的IO电平标准一般为1.8V和3.3V,上拉电源一般不超过…

【C++入门】命名空间的定义与使用

目  录1 命名空间1.1 命名空间定义1.2 命名空间使用1 命名空间 在C/C中&#xff0c;变量、函数和类都是大量存在的&#xff0c;这些变量、函数、类的名称将都存在于全局作用域中&#xff0c;可能会导致很多冲突。 使用命名空间的目的是对标识符的名称进行本地化&#xff0c;以…