java中自定义线程池最佳实践

java中自定义线程池最佳实践

在现代应用程序中,线程池是一种常用的技术,可以有效管理和复用线程资源,从而提升系统的并发性能和稳定性。本文将详细介绍自定义线程池的最佳实践,涵盖从线程池大小配置、队列选择到拒绝策略、任务设计等各个方面。

1. 线程池大小配置

选择合适的线程池大小是提高系统性能的关键。不同类型的任务对线程池大小的需求不同:

CPU密集型任务

CPU密集型任务主要消耗CPU资源,线程池大小应接近于CPU核心数。过多的线程会导致频繁的上下文切换,反而降低性能。例如,如果你的系统有8个核心,线程池大小可以设置为7或8。

IO密集型任务

IO密集型任务主要等待IO操作完成,线程大部分时间处于阻塞状态。线程池大小应大于CPU核心数,公式通常为:
线程池大小 = C P U 核心数 1 − 阻塞系数 线程池大小 = \frac {CPU核心数}{1−阻塞系数} 线程池大小=1阻塞系数CPU核心数

阻塞系数在0到1之间,例如0.9表示任务阻塞时间占90%。

2. 使用合适的BlockingQueue

线程池通过队列管理任务,选择合适的队列类型至关重要:

  • ArrayBlockingQueue:有界队列,适用于固定大小的任务队列。
  • LinkedBlockingQueue:默认无界队列,适用于任务队列可能较长但不会无限增长的情况。
  • SynchronousQueue:不存储任务,每个插入操作必须等待相应的移除操作,适用于直接交接任务的场景。
  • PriorityBlockingQueue:优先级队列,任务根据优先级执行。

3. 设置合理的拒绝策略

当线程池和队列已满时,需要选择合适的拒绝策略:

  • ThreadPoolExecutor.AbortPolicy:默认策略,直接抛出RejectedExecutionException。
  • ThreadPoolExecutor.CallerRunsPolicy:由调用线程执行任务,减缓任务提交速度。
  • ThreadPoolExecutor.DiscardPolicy:直接丢弃任务。
  • ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列中最老的任务,然后尝试重新提交当前任务。

4. 核心线程和非核心线程

理解核心线程和非核心线程的区别有助于更好地配置线程池:

  • 核心线程:通常始终保持存活,即使它们空闲也不会被回收。
  • 非核心线程:在空闲时间超过keepAliveTime时会被回收,适用于负载不均衡的场景。

5. 定期监控和调优

监控和调优是维持线程池高效运行的关键:

  • 监控:使用工具(如JMX、Prometheus)监控线程池的活跃线程数、任务队列长度、已完成任务数等。
  • 调优:根据监控数据调整线程池大小、队列大小、拒绝策略等配置。

6. 避免死锁

避免任务之间的相互依赖,确保一个任务的执行不需要等待另一个任务完成,从而防止死锁。

7. 使用合适的线程工厂

自定义线程工厂可以为线程池中的线程命名,设置优先级,甚至是指定未捕获异常的处理方法:

public class CustomThreadFactory implements ThreadFactory {private final AtomicInteger threadNumber = new AtomicInteger(1);private final String namePrefix;public CustomThreadFactory(String namePrefix) {this.namePrefix = namePrefix;}@Overridepublic Thread newThread(Runnable r) {Thread t = new Thread(r, namePrefix + "-thread-" + threadNumber.getAndIncrement());if (t.isDaemon())t.setDaemon(false);if (t.getPriority() != Thread.NORM_PRIORITY)t.setPriority(Thread.NORM_PRIORITY);return t;}
}

8. 任务设计

设计高效的任务有助于充分利用线程池:

  • 短时间任务:确保任务短小、执行时间较短,避免长期占用线程。
  • 幂等性:任务应尽量设计为幂等,即重复执行不会产生副作用,便于重试和恢复。

9. 使用现有的线程池实现

优先使用Java并发包中提供的线程池实现(如Executors.newFixedThreadPool、Executors.newCachedThreadPool),它们经过了广泛测试和优化。

10. 合理的超时和中断处理

任务应支持中断,及时响应Thread.interrupt,并设置任务执行超时时间,避免长时间挂起:

ExecutorService executor = Executors.newFixedThreadPool(10);
Future<?> future = executor.submit(new CallableTask());
try {future.get(5, TimeUnit.SECONDS);
} catch (TimeoutException e) {future.cancel(true);
}

总结

通过遵循这些最佳实践,可以设计和实现高效、稳定的自定义线程池,从而更好地处理并发任务,提高应用的性能和响应能力。线程池的配置和调优是一个持续的过程,需要不断根据实际情况进行调整和优化。

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

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

相关文章

基于STM32+ESP8266打造智能家居温湿度监控系统(附源码接线图)

摘要: 本文将介绍如何使用STM32单片机、ESP8266 Wi-Fi模块和Python Flask框架构建一个完整的物联网系统&#xff0c;实现传感器数据采集、无线传输、云端存储及Web可视化展示。 关键词: STM32, ESP8266, 传感器, Flask, 物联网, 云平台, 数据可视化 1. 系统概述 本系统以STM…

Spring底层原理之proxyBeanMenthod实例 动态代理 反射 Bean的拦截

proxyBeanMenthod 假设我们要进行一个系统的二次开发 然后第一次开发我们实用的是XML声明bean 二次开发的时候要用注解 我们如何把bean都加载上来呢 我们首先创建一个全新的配置类 package com.bigdata1421.config;public class SpringConfig32 { } 我们创建一个APP 加载…

Perl语言入门学习读物

1. PERL 是什么? Perl 最初的设计者为Larry Wall&#xff0c;Perl借取了C、sed、awk、shell scripting以及很多其他程序语言的特性。Perl一般被称为“实用报表提取语言”(PracticalExtraction andReportLanguage)&#xff0c;有时也被称做“病态折中垃圾列表器”(Pathologica…

springboot+vue3无感知刷新token实战

目录 一、java后端 1、token构造实现类 ①验证码方式实现类 ②刷新token方式实现类 2、token相关操作&#xff1a;setCookie ①createToken ②refreshToken 二、前端&#xff08;vue3axios&#xff09; web网站中&#xff0c;前后端交互时&#xff0c;通常使用token机制…

全球最快的 JSON 文件查询工具

本文字数&#xff1a;1684&#xff1b;估计阅读时间&#xff1a;5分钟 审校&#xff1a;庄晓东&#xff08;魏庄&#xff09; 本文在公众号【ClickHouseInc】首发 介绍 在 ClickHouse&#xff0c;我们热衷于基准测试和性能优化。所以当我第一次看到 Hacker News 上那篇“查询大…

代码随想录算法训练营day31|134.加油站、135. 分发糖果、406.根据身高重建队列

134.加油站 如下图所示&#xff1a; 当索引一道2的时候&#xff0c;剩余油量的总量13-6 < 0&#xff0c;这个时候说明以索引0为起点不合适&#xff0c;将起点更新为索引3. 两点证明&#xff1a; 1.如果我们从蓝色段中间选一个点开始&#xff0c;是不是最后sumGas就不小于0…

从灵感到成品:使用AI生成博客文章的完整指南

在信息爆炸的时代&#xff0c;每个人都有讲述自己故事的权利和需求。博客作为一种表达方式&#xff0c;不仅能记录个人经历&#xff0c;还能分享知识和观点。然而&#xff0c;许多人在写博客文章时&#xff0c;常常会遇到灵感枯竭、时间不够用或者不知道如何开始等问题。幸运的…

光伏储能系统/安科瑞DTSD1352-CF双向计量表-安科瑞 蒋静

1 长期以来&#xff0c;我国施行居民用电低价政策&#xff0c;居民电价大幅低于供电成本&#xff0c;虽然实施了全天分三时段的阶梯电价政策&#xff0c;但过去近10年中高峰节电的效果却不够明显。从分时用电运作机制来看&#xff0c;居民用电价格的波动幅度不大&#xff0c;但…

华为云鲲鹏架构docker部署2048小游戏

华为云鲲鹏架构docker部署2048小游戏 1. 鲲鹏架构ESC2. 配置docker3. 上传2048镜像4. 删除容器,镜像 1. 鲲鹏架构ESC 2. 配置docker 安装dockeryum -y install docker开机启动 systemctl enable docker启动docker服务 systemctl start docker查询docker的运行版本 docker -v3…

时序分析基本概念介绍——min pulse width 最小脉冲宽度

文章目录 前言一、什么是 min pulse width&#xff1f;二、为什么检查 min pulse width&#xff1f;三、如何设置 min pulse width约束&#xff1f;1. 在sdc里面定义2. library里面定义 四、如何检查 min pulse width&#xff1f;五、如何修复 min pulse width&#xff1f;总结…

docker启动ws-scrcpy和redroid记录

git克隆最新的ws-scrcpy代码 git clone gitgithub.com:NetrisTV/ws-scrcpy.git进入ws-scrcpy目录新建Dockerfile文件&#xff0c;内容如下 FROM node:16-alpine WORKDIR /appRUN npm config set registry http://mirrors.cloud.tencent.com/npm/ RUN npm install -g node-gyp…

攻防世界-Web题目1

目录 cookie 1、题目 2、知识点 3、思路 get_post 1、题目 2、知识点 3、思路 disabled_button 1、题目 2、知识点 3、思路 backup 1、题目 2、知识点 3、思路 cookie 1、题目 2、知识点 cookie&#xff0c;数据包 3、思路 题目提示我们cookie&#xff0c;抓…

Markdown中如何插入空行和空格

Markdown 是一种轻量级的标记语言&#xff0c;它的主要目标是以易读易写为优先&#xff0c;并兼容 HTML。虽然 Markdown 本身对于排版的要求比较宽松&#xff0c;但在某些情况下&#xff0c;我们可能需要在文档中插入空行或空格来达到特定的排版效果。 插入空行 在Markdown中…

【ai】trition:tritonclient.utils.shared_memory 仅支持linux

Can’t find tritonclient.utils.shared_memory on WIN10 #4149yolov4的python客户端 导入以后,windows 的pycharm 就是看不到折腾了很久:SaviorEnv 环境下安装tritonclient[all]也会失败 (base) C:\Users\zhangbin>conda create -n SaviorEnv python=3.8 Collecting pack…

ubuntu 18 虚拟机安装(1)

ubuntu 18 虚拟机安装 ubuntu 18.04.6 Ubuntu 18.04.6 LTS (Bionic Beaver) https://releases.ubuntu.com/bionic/ 参考&#xff1a; 设置固定IP地址 https://blog.csdn.net/wowocpp/article/details/126160428 https://www.jianshu.com/p/1d133c0dec9d ubuntu-18.04.6-l…

元数据管理的发展历程你了解吗?元数据管理要克服哪些挑战?

在当今的信息化时代&#xff0c;数据的价值已被广泛认可&#xff0c;而元数据作为描述数据的数据&#xff0c;其作用日益凸显。元数据管理&#xff0c;作为确保数据质量、促进数据共享和提高数据透明度的关键环节&#xff0c;对企业的数据战略至关重要。随着技术的发展&#xf…

程序设计中对内存分配管理的思考,进程内存、线程内存、共享池、栈、堆

设计一个程序&#xff0c;要考虑如何分配和管理内存&#xff0c;以下是对所有内存分配和管理类型的总结。 第一、进程级的内存资源&#xff0c;也叫全局静态内存&#xff0c;其生命周期是伴随整个进程的运行期间&#xff0c;可以用作在进程范围内共享数据的方法。对应于C语言的…

C#1.0-11.0所有历史版本主要特性总结

文章目录 前言名词解释主要版本一览表各版本主要特性一句话总结 C# 1.0 (Visual Studio 2002, .Net Framework 1.0)C# 2.0 (Visual Studio 2005, .Net Framework 2.0)C# 3.0 (Visual Studio 2008, .Net Framework 3.0)C# 4.0 (Visual Studio 2010, .Net Framework 4)C# 5.0 (V…

Bigram 分词学习

Bigram 分词&#xff1a;概念、应用与中文实践 Bigram 分词是一种基础而有效的文本处理技术&#xff0c;特别是在自然语言处理中有着广泛的应用。本文将详细解释 Bigram 分词的概念、它在各个领域的应用&#xff0c;以及在中文处理中的独特优势和实践。 什么是 Bigram 分词&a…

DataWhale - 吃瓜教程学习笔记(三)

学习视频&#xff1a;第3章-对数几率回归_哔哩哔哩_bilibili 西瓜书对应章节&#xff1a; 3.3 对数几率回归 sigmoid函数 极大似然估计建模 信息论 以概率论、随机过程为基本研究工具&#xff0c;研究广义通信系统的整个过程 - 信息熵 &#xff08;信息期望&#xff09; 度…