【面试题】如何合理的设置线程池中的参数

news2024/9/21 18:44:56

一、ThreadPoolExecutor 的重要参数

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler) {
}
  1. corePoolSize(核心线程数)

    • 核心线程会一直存活,即使没有任务需要执行。
    • 当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处理任务。
    • 设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭。
    • 根据任务类型(CPU 密集型或 IO 密集型)以及机器的 CPU 核数来设置。
      • CPU 密集型:需要大量的CPU计算,所以corePoolSize = CPU 核数 + 1
      • IO 密集型:需要去到磁盘进行读取,速度会比CPU运算更快corePoolSize = CPU 核数 * 2
  2. maximumPoolSize(最大线程数)

    • 当线程数大于等于核心线程数且任务队列已满时,线程池会创建新线程来处理任务。
    • 当线程数等于最大线程数且任务队列已满时,线程池会拒绝处理任务而抛出异常。
  3. keepAliveTime(线程空闲时间)

    • 当线程空闲时间达到keepAliveTime时,线程会退出,直到线程数量等于核心线程数。如果allowCoreThreadTimeout=true,则会直到线程数量为 0。
  4. queueCapacity(任务队列容量,阻塞队列)

    • 当核心线程数达到最大时,新任务会放在队列中排队等待执行。
  5. allowCoreThreadTimeout(允许核心线程超时)

    • 控制核心线程是否可以超时关闭。
  6. rejectedExecutionHandler(任务拒绝处理器)

    • 当线程数已经达到最大线程数且队列已满,或者线程池被调用shutdown()后提交任务,会拒绝新任务。
    • ThreadPoolExecutor 采用策略设计模式处理拒绝任务的场景,有多种策略可供选择:
      • AbortPolicy:丢弃任务,抛运行时异常。
      • CallerRunsPolicy:执行任务。
      • DiscardPolicy:忽视,什么都不会发生。
      • DiscardOldestPolicy:从队列中踢出最先进入队列(最后一个执行)的任务。

二、如何设置参数

  1. 首先确定几个值:

    • tasks:每秒的任务数,假设为 500 - 1000。
    • taskcost:每个任务花费时间,假设为 0.1s。
    • responsetime:系统允许容忍的最大响应时间,假设为 1s。
  2. 计算核心线程数:

    • threadcount = tasks / (1 / taskcost) = tasks * taskcost = (500 ~ 1000) * 0.1 = 50 ~ 100个线程。核心线程数应大于 50,根据 8020 原则,如果 80%的每秒任务数小于 800,那么核心线程数设置为 80 即可。
  3. 计算任务队列容量:

    • queueCapacity = (coreSizePool / taskcost) * responsetime。例如,核心线程数为 80 时,队列容量为 80/0.1*1 = 800。这意味着队列里的线程可以等待 1s,超过了的需要新开线程来执行。
  4. 最大线程数在生产环境上往往设置成与核心线程数一样,这样可以减少在处理过程中创建线程的开销。

  5. rejectedExecutionHandler根据具体情况来决定任务拒绝策略,任务不重要可丢弃,任务重要则要利用一些缓冲机制来处理。

  6. keepAliveTimeallowCoreThreadTimeout采用默认通常能满足。实际情况要根据机器性能来调整,如果在未达到最大线程数的情况机器 CPU load 已经满了,则需要通过升级硬件和优化代码,降低taskcost来处理。

三、线程池队列的选择

  1. 无界队列

    • 常用的为无界的LinkedBlockingQueue。使用此队列作为阻塞队列时要当心,当任务耗时较长时可能会导致大量新任务在队列中堆积最终导致内存溢出(OOM)。
    • 当每个任务完全独立于其他任务,即任务执行互不影响时,适合于使用无界队列,例如在 Web 页服务器中。这种排队可用于处理瞬态突发请求,当命令以超过队列所能处理的平均数连续到达时,此策略允许无界线程具有增长的可能性。但此时maximumPoolSize的值也就无效了。
  2. 有界队列

    • 常用的有两类,一类是遵循先进先出(FIFO)原则的队列如ArrayBlockingQueue,另一类是优先级队列如PriorityBlockingQueue
    • 使用有界队列时队列大小需和线程池大小互相配合,线程池较小有界队列较大时可减少内存消耗,降低 CPU 使用率和上下文切换,但是可能会限制系统吞吐量。
  3. 同步移交队列

    • 如果不希望任务在队列中等待而是希望将任务直接移交给工作线程,可使用SynchronousQueue作为等待队列。
    • SynchronousQueue不是一个真正的队列,而是一种线程之间移交的机制。只有在使用无界线程池或者有饱和策略时才建议使用该队列。

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

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

相关文章

如何使用IIC外设(硬件IIC)

本文重点叙述如何使用芯片自带的 IIC 外设&#xff0c;即硬件 IIC&#xff0c;实现 IIC 通信。文章《IIC通信基础_cpu的iic通信-CSDN博客》 中&#xff0c;叙述了软件 IIC 通信和硬件 IIC 通信的区别&#xff0c; 并且重点叙述了 IIC 的通信协议。在使用软件进行 IIC 通信时&am…

git安装包夸克网盘下载

git安装包夸克网盘下载 git夸克网盘 git网站上的安装包下载速度有点慢&#xff0c;因此为了方便以后下载就将文件保存到夸克网盘上&#xff0c;链接&#xff1a;我用夸克网盘分享了「git」&#xff0c;点击链接即可保存。 链接&#xff1a;https://pan.quark.cn/s/07c73c4a30…

MongoDB在Linux系统中的安装与配置指南

在这篇文章中&#xff0c;我们将介绍如何在CentOS 7服务器上安装MongoDB&#xff0c;并通过DataX将数据从MongoDB迁移到MySQL数据库。这将包括MongoDB的安装、配置、数据准备以及使用DataX进行数据迁移的详细步骤。 MongoDB简介 MongoDB是一个高性能、开源、无模式的文档型数据…

c++9月20日

1.思维导图 2.顺序表 头文件 #ifndef RECTANGLE_H #define RECTANGLE_H#include <iostream>using namespace std;using datatype int ;//类型重定义class Seqlist { private://私有权限datatype *ptr; //指向堆区申请空间的起始地址int size;//堆区空间的长度int len …

鸿蒙OS 线程间通信

鸿蒙OS 线程间通信概述 在开发过程中&#xff0c;开发者经常需要在当前线程中处理下载任务等较为耗时的操作&#xff0c;但是又不希望当前的线程受到阻塞。此时&#xff0c;就可以使用 EventHandler 机制。EventHandler 是 HarmonyOS 用于处理线程间通信的一种机制&#xff0c…

Spring Boot助力高校心理辅导系统升级

3 系统分析 3.1可行性分析 在进行可行性分析时&#xff0c;我们通常根据软件工程里方法&#xff0c;通过四个方面来进行分析&#xff0c;分别是技术、经济、操作和法律可行性。因此&#xff0c;在基于对目标系统的基本调查和研究后&#xff0c;对提出的基本方案进行可行性分析。…

如何着手创建企业数据目录?(三)权限管理及版本控制

前文导读&#xff1a; 《如何着手创建企业数据目录&#xff1f;&#xff08;一&#xff09;数据目录的设定》 《如何着手创建企业数据目录&#xff1f;&#xff08;二&#xff09;数据的命名与维护》 前面聊过了数据目录的设定、数据命名规则和维护规则&#xff0c;今天我们继续…

【java实现json转化为CSV文件】

文章目录 JSON文件中的数据格式测试文件转换的接口 JSON文件中的数据格式 单条数据展开后如下&#xff1a; {"text": "《邪少兵王》是冰火未央写的网络小说连载于旗峰天下","spo_list":[{"predicate": "作者", "objec…

Windows环境下搭建MySQL主从同步实现读写分离

文章目录 前言读写分离的基本原理 环境介绍及说明主库my.ini初始配置创建用于同步的数据库和表 一、新增mysql从库1.复制mysql文件夹2.修改从库的my.ini3.安装到windows服务 二、在my.ini中配置主、从库相关参数1.主库新增配置参数不同版本参数不同问题 2.从库新增配置参数3.删…

rabbitmq 短信验证码

1.生成的验证码用redis存 减少数据库压力 2.通知运营商发送短信的事情交给rabbitmq的队列去做&#xff0c;无论成功或者是失败&#xff0c;用户那边都不知道。没有收到验证码&#xff08;监听失败&#xff09;用户只会觉得是运营商的问题&#xff0c;而不会怀疑是我们的系统有问…

Linux文件IO(四)-返回错误处理与errno详解

1.前言 在上一文章中&#xff0c;给大家编写了很多的示例代码&#xff0c;大家会发现这些示例代码会有一个共同的特点&#xff0c;那就是当判断函数执行失败后&#xff0c;会调用 return 退出程序&#xff0c;但是对于我们来说&#xff0c;我们并不知道为什么会出错&#xff0…

C++进阶|多态知识点详解及经典面试题总结

&#x1f36c; mooridy-CSDN博客 &#x1f9c1;C专栏&#xff08;更新中&#xff01;&#xff09; 目录 1. 多态的概念 2. 多态的定义及实现 2.1 多态的构成条件 2.2 虚函数的重写/覆盖 2.3 虚函数重写的⼀些其他问题 2.4 override 和 final关键字 2.5 重载/重写/隐藏的…

(笔记自用)位运算总结+LeetCode例题:颠倒二进制位+位1的个数

一.位运算总结: 在解题之前理解一下为什么需要位运算&#xff1f;它的本质是什么&#xff1f; 力扣上不少位运算相关的题&#xff0c;并且很多题也会用到位运算的技巧。这又是为什么&#xff1f; 位运算的由来 在计算机里面&#xff0c;任何数据最终都是用数字来表示的&…

mysqldump使用cmd窗口和powersell窗口导出sql中文乱码的问题

项目场景 我在使用Mariadb数据库更新数据的时候&#xff0c;由于数据库的表格中含有中文&#xff0c;在使用mysqldump导出sql语句的时候&#xff0c;中文显示乱码&#xff0c;如下图所示&#xff1a; 环境描述 系统&#xff1a;windows10数据库&#xff1a; Mariadb -10.6.16…

Vue2中路由的介绍和使用

一.路由的基本概念 一说路由&#xff0c;大家首先想到的可能是路由器&#xff0c;路由器的原理就是给连接的设备一个IP地址&#xff0c;通过IP地址来映射到设备&#xff0c;实现连接&#xff0c;本质上是一种映射关系。 在vue2中就是路径与组件间的映射。 路由是使用vue2制作…

Python爬虫使用实例-umei

优美图库 www.umei.cc BV1Ag41137re 1/获取资源 查看网站资源结构 多页&#xff0c;每个item只有一张图 多页&#xff0c;每个item都是一个图集 最大页码 内外层图集均有若干page。 通过尾页按钮确定pageNum&#xff1a; 2/发送请求 response requests.get(urlurl, header…

快速将Mongo Compass的shell语句转成java代码

步骤一、从MongoCompass中获取java代码 将java代码复制出来&#xff0c;从MongoCompass中复制的java代码基本格式如下&#xff1a;&#xff08;是Bson原生格式&#xff09; List<Document> list Arrays.asList(new Document("$match",new Document("name…

探索视频美颜SDK与直播美颜工具的开发实践方案

直播平台的不断发展&#xff0c;让开发出性能优异、效果自然的美颜技术&#xff0c;成为了技术团队必须面对的重要挑战。本篇文章&#xff0c;小编将深入讲解视频美颜SDK与直播美颜工具的开发实践方案。 一、视频美颜SDK的核心功能 视频美颜SDK是视频处理中的核心组件&#xf…

Cocos Creator3.x设置动态加载背景图并且循环移动

效果图 项目结构 项目层级结构&#xff1a; 预制&#xff1a; 代码 import { _decorator, CCFloat, Component, Node, Sprite, instantiate, Prefab, assert } from cc; const { ccclass, property } _decorator;/*** 背景脚本*/ ccclass(Background) export class Backg…

2024年华为杯研赛(D题)数学建模竞赛解题思路|完整代码论文集合

我是Tina表姐&#xff0c;毕业于中国人民大学&#xff0c;对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在&#xff0c;我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合…