java线程池原理浅析

问题与解决:

问题:

查询大数据量的时候,例如一次返回50w数据量的包,循环去查询发现读取会超时。

解决方案:

经过思考采用多线程去分页查询。使用线程池创建多个线程去查询分页后的数据最后汇总一下,解决了一次查询大量数据返回超时的问题。

一次查询现状:



多线程分页查询改造图:





效果:使用多线程去查询查询时间由原来的10s减少到现在的300ms。

线程池是什么?

线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL,clickhouse等数据库。

线程池好处:

1.降低资源消耗:通过池化技术重复利用已创建的线程,降低线程创建和销毁造成的损耗。

2.提高响应速度:任务到达时,无需等待线程创建即可立即执行。

3.提高线程的可管理性:线程是稀缺资源,如果无限制创建,不仅会消耗系统资源,还会因为线程的不合理分布导致资源调度失衡,降低系统的稳定性。

4.使用线程池可以进行统一的分配、调优和监控。提供更多更强大的功能:线程池具备可拓展性,允许开发人员向其中增加更多的功能。比如延时定时线程池ScheduledThreadPoolExecutor,就允许任务延期执行或定期执行。

线程池解决的问题是什么:

1.频繁申请/销毁资源和调度资源,将带来额外的消耗,可能会非常巨大。

2.对资源无限申请缺少抑制手段,易引发系统资源耗尽的风险。

3.系统无法合理管理内部的资源分布,会降低系统的稳定性。

Java线程池参数解析:

Java 提供的线程池相关的工具类中,最核心的是 ThreadPoolExecutor,完备的构造函数如下:

ThreadPoolExecutor(
 int corePoolSize,
 int maximumPoolSize,
 long keepAliveTime,
 TimeUnit unit,
 BlockingQueue<Runnable> workQueue,
 ThreadFactory threadFactory,
 RejectedExecutionHandler handler) 

参数说明:

corePoolSize:线程池的核心线程数

备注:默认情况下,线程池创建后的初始线程数为 0,当有任务到来就会创建一个线程去执行任务,当线程池中的线程数目达到 corePoolSize,就会把到达的任务放到缓存队列当中。

maximumPoolSize:线程池的最大线程数

备注:核心线程忙不过来且任务存储队列满了的情况下,还有新任务进来的话就会继续开辟线程,但是也不是任意的开辟线程数量,线程数(包含核心线程)达到maximumPoolSize后就不会产生新线程了,就会执行拒绝策略。

keepAliveTime:当活跃线程数大于核心线程数时,空闲的多余线程最大存活时间

备注:默认情况下,当线程池中的线程数大于 corePoolSize 时,如果一个线程空闲的时间达到keepAliveTime,则该线程会终止,直到线程池中的线程数不超过 corePoolSize。但是如果调用了 allowCoreThreadTimeOut(true) 方法,此时就算线程池中的线程数不大于corePoolSize ,keepAliveTime 参数也会起作用,直到线程池中的线程数为 0。

unit:参数 keepAliveTime 的时间单位。

取值:

TimeUnit.DAYS;               //天
TimeUnit.HOURS;             //小时 
TimeUnit.MINUTES;           //分钟 
TimeUnit.SECONDS;           //秒
TimeUnit.MILLISECONDS;      //毫秒 
TimeUnit.MICROSECONDS;      //微妙
TimeUnit.NANOSECONDS;       //纳秒 

workQueue:任务阻塞队列,用来存储等待执行的任务。

备注:

核心线程数满了后还有任务继续提交到线程池的话,就先进入workQueue。

workQueue通常情况下有如下选择:

LinkedBlockingQueue:无界队列,意味着无限制,其实是有限制,大小是int的最大值。也可以自定义大小。

ArrayBlockingQueue:有界队列,可以自定义大小,到了阈值就开启新线程(不会超过maximumPoolSize)。

SynchronousQueue:Executors.newCachedThreadPool();默认使用的队列。也不算是个队列,他不没有存储元素的能力。

一般都采取LinkedBlockingQueue,因为他也可以设置大小,可以取代ArrayBlockingQueue有界队列。

threadFactory:用于创建新线程的线程工厂。

备注:默认采用的是DefaultThreadFactory,主要负责创建线程。newThread()方法。创建出来的线程都在同一个线程组且优先级也是一样的。

handler:拒绝策略,任务量超出线程池的配置限制或执行shutdown还在继续提交任务的话,会执行handler的逻辑。

备注:

如果线程池中所有的线程都在忙碌,并且工作队列也满了(前提是工作队列是有界队列),那么此时提交任务,线程池就会拒绝接收。拒绝策略可以通过 handler 参数来指定。

ThreadPoolExecutor 提供了以下4种拒绝策略:

CallerRunsPolicy:提交任务的线程自己去执行该任务。

AbortPolicy:默认的拒绝策略,会 throws RejectedExecutionException。

DiscardPolicy:直接丢弃任务,没有任何异常抛出。

DiscardOldestPolicy:丢弃最老的任务,就是把最早进入工作队列的任务丢弃,然后把新任务加入到工作队列。

线程池工作原理:





java提供的常用线程池:

1.newCachedThreadPool:用来创建一个可以无限扩大的线程池,适用于负载较轻的场景,执行短期异步任务。(可以使任务快速得到执行,因为任务时间执行短,可以很快结束,也不会造成cpu过度切换)

2.newFixedThreadPool:创建一个固定大小的线程池,因为采用无界的阻塞队列,所以实际线程数量永远不会变化,适用于负载较重的场景,对当前线程数量进行限制。(保证线程数可控,不会造成线程过多,导致系统负载更为严重)

3.newSingleThreadExecutor:创建一个单线程的线程池,适用于需要保证顺序执行各个任务。

4.newScheduledThreadPool:适用于执行延时或者周期性任务。

作者:智能平台 郭春元

来源:京东零售技术 转载请注明来源

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

双指针算法_盛水最多的容器

题目&#xff1a; 题目解析&#xff1a; 如图所示&#xff0c;一个数组内部存储的是高度&#xff0c;求数组中&#xff0c;能够组成最大容量的两个元素&#xff0c;需要注意的是容量是 高度*宽度&#xff0c;这里的宽度指的是两个数字之间的距离&#xff0c;且需要注意高度中&…

现代c++内存管理的方式有哪些?

在现代C编程实践中&#xff0c;内存管理是软件开发中的核心议题之一&#xff0c;直接影响着程序的性能、稳定性以及资源的有效利用。C提供了一系列丰富且灵活的内存管理机制&#xff0c;以适应不同场景的需求和应对潜在的内存问题&#xff0c;如内存泄漏、野指针和堆栈溢出等。…

VUE之首次加载项目缓慢

最近公司有个大型的项目&#xff0c;使用vue2开发的&#xff0c;但是最终开发完成之后&#xff0c;项目发布到线上&#xff0c;首次加载项目特别缓慢&#xff0c;有时候至少三十秒才能加载完成&#xff0c;加载太慢了&#xff0c;太影响用户体验了&#xff0c;最近研究了一下优…

java spirng和 mybatis 常用的注解有哪些

当在Java Spring和MyBatis中进行开发时&#xff0c;常用的注解对于简化配置和提高开发效率非常重要。以下是更多常用的注解以及它们的详细说明和用途&#xff1a; 在Spring中常用的注解&#xff1a; Component&#xff1a; 用途&#xff1a;表明一个类会作为组件被Spring容器管…

AJAX(一):初识AJAX、http协议、配置环境、发送AJAX请求、请求时的问题

一、什么是AJAX 1.AJAX 就是异步的JS和XML。通过AJAX 可以在浏览器中向服务器发送异步请求&#xff0c;最大的优势&#xff1a;无刷新获取数据。AJAX 不是新的编程语言&#xff0c;而是一种将现有的标准组合在一起使用的新方式。 2.XML 可扩展标记语言。XML被设计用来传输和…

C++(13) STL 库初识

文章目录 STL 库初识1. STL 库1.1 STL 库的案例1.2 C 标准模板库的三个组件1.3 案例展示 2. 迭代器1.1 概述和分类2.2 代码案例 STL 库初识 1. STL 库 1.1 STL 库的案例 类似学习了模板的概念。CSTL (标准模板库) 是一套功能强大的 C 模板类&#xff0c;提供了通用的模板类和…

【Linux详解】——进程信号

&#x1f4d6; 前言&#xff1a;本期介绍进程信号。 目录 &#x1f552; 1. 生活角度的信号&#x1f552; 2. 技术角度的信号&#x1f558; 2.1 Linux中的信号&#x1f558; 2.2 进程对信号的处理 &#x1f552; 3. 信号的产生方式&#x1f558; 3.1 键盘产生&#x1f558; 3.2…

svn如何合并代码以及解决合并冲突的问题(把分支代码合并到主版本)

1.选择主版本的文件夹。 ​​​​​​​ 2.选择合并一个不同的分支 3.选择主分支的路径和要合并的代码范围 4.点解next 选择这两个选项 5.然后点击Test merge&#xff0c;查看能否和并成功 有红色的提示&#xff0c;说明是有冲突的&#xff0c; 都是黑色说明能够合并成功 …

【无标题】如何使用 MuLogin 设置代理

如何使用 MuLogin 设置代理 使用 MuLogin 浏览器设置我们的代理&#xff0c;轻松管理多个社交媒体或电子商务帐户。 什么是MuLogin&#xff1f; MuLogin 是一款虚拟反检测浏览器&#xff0c;使用户能够管理多个电子商务、社交媒体和广告帐户&#xff0c;而无需验证码或 IP 禁…

星巴克终止Odyssey Beta NFT计划

日前&#xff0c;咖啡品牌星巴克宣布将于3月31日终止其NFT产品Odyssey Beta客户忠诚度计划。这意味着&#xff0c;曾经旨在改进会员忠诚度的Web3 产品Starbucks Odyssey将终止&#xff0c;构筑多年的Web2会员系统“星享俱乐部”脱去了Web3外衣&#xff0c;回到了本来的面貌。 至…

体验分低导致闭店!抖音小店体验分是什么?教你如何提高体验分!

哈喽~我是电商月月 相信开抖音小店的伙伴们对体验分这个东西都不陌生&#xff0c;但如何有效的提高体验分你们知道吗&#xff1f; 今天&#xff0c;我就来讲讲抖音小店体验分低有什么后果&#xff0c;同时在后面说一下体验分降低如何提高&#xff01; 大家可根据情况不同自行…

羊大师羊奶靠谱么?品质保障深度解析

羊大师羊奶靠谱么&#xff1f;品质保障深度解析 羊大师羊奶&#xff0c;作为市场上的知名品牌&#xff0c;其靠谱性一直备受消费者关注。那么&#xff0c;羊大师羊奶究竟靠谱不靠谱呢&#xff1f;这就需要从品质保障和消费者信赖两个方面进行深入解析。 从品质保障的角度来看&…

【JAVA】数据类型与变量(主要学习与c语言不同之处)

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;橘橙黄又青-CSDN博客 目标&#xff1a; 1. 字面常量 2. 数据类型 3. 变量 1.字面常量 在上节课 Hello…

Mysql的高级语句2

目录 引言&#xff1a; 一、按关键字进行排序 1、语句以及用法 2、先创建一个新的数据库以及数据表&#xff0c;并且导入内容 二、关键字排序操作 1、单个字段排序 ①按照分数进行排序&#xff0c;默认不指定就是升序排列 ②按照分数降序排列 ③结合where进行条件过滤…

C# LINQ笔记

C# LINQ笔记 from子句 foreach语句命令式指定了按顺序一个个访问集合中的项。from子句只是声明式地规定集合中的每个项都要访问&#xff0c;并没有指定顺序。foreach在遇到代码时就执行其主体。from子句什么也不执行&#xff0c;只有在遇到访问查询变量的语句时才会执行。 u…

【zlm】问题记录:chrome更新引起的拉不出webrtc; 证书校验引起的放几秒中断

目录 chrome更新引起的拉不出webrtc 证书校验引起的放几秒中断 chrome更新引起的拉不出webrtc 【zlm】最新的chrome版本中的报错&#xff1a; 我有个问题event.js:8 [RTCPusherPlayer] DOMException: Failed to execute setRemoteDescription on RTCPeerConnection: Failed …

太牛逼了!视频号下载器手机版(工具+方法)绝了

在众多的视频号下载中&#xff0c;可以说这个工具真的是很牛逼了&#xff01;这里问大家一个问题&#xff01; 你使用视频号下载工具以及视频号下载器都会不会因时间导致而失效呢&#xff1f; 自从小编使用了这款工具后&#xff0c;就不会因为视频失效而烦恼。 很多人免费推荐…

互斥锁与信号量的区别

信号量与互斥锁都是用于多线程编程中&#xff0c;以实现资源共享和线程同步的机制&#xff0c;但它们在应用场景、实现方式和性能特点上有所不同。以下是详细介绍&#xff1a; 应用场景。信号量主要用于线程同步&#xff0c;其核心思想是控制对共享资源的访问许可&#xff0c;…

javaWeb项目-快捷酒店信息管理系统功能介绍

开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 项目关键技术 1、JSP技术 JSP(Java…

Windows虚拟主机上的网站如何来设置默认首页

近期有网友咨询想要知道Windows虚拟主机上的网站如何来设置默认首页,以便后期他需要时可以自行处理。这边了解到他当前使用的是Hostease 的Windows 虚拟主机&#xff0c;而设置默认首页的操作步骤如下&#xff1a; 1.Hostease的Windows虚拟主机都是带Plesk面板的,因此需要先进入…