JAVA SpringBoot 项目 多线程、线程池的使用。

1.1  线程:
线程就是进程中的单个顺序控制流,也可以理解成是一条执行路径

单线程:一个进程中包含一个顺序控制流(一条执行路径)

多线程:一个进程中包含多个顺序控制流(多条执行路径)

在java语言中:
 线程A和线程B,堆内存和方法区内存共享。
 但是栈内存独立,一个线程一个栈。

假设启动10个线程,会有10个栈空间,每个栈和每个栈之间,互不干扰,各自执行各自的,这就是多线程并发。

java中之所以有多线程机制,目的就是为了提高程序的处理效率。

对于单核的CPU来说,不能够做到真正的多线程并发,但是可以做到给人一种“多线程并发”的感觉。对于单核的CPU来说,在某一个时间点上实际上只能处理一件事情,但是由于CPU的处理速度极快,多个线程之间频繁切换执行,跟人来的感觉是多个事情同时在做。

 1.2 线程的生命周期

1.3 线程池

        线程池可以看做是线程的集合。它的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后 启动这些任务,如果线程数量超过了最大数量超出数量的线程排队等候,等其它线程执行完毕, 再从队列中取出任务来执行。他的主要特点为:线程复用;控制最大并发数;管理线程。

1.4 为什么使用线程池

        使用线程池最大的原因就是可以根据系统的需求和硬件环境灵活的控制线程的数量,且可以对所有的线程进行统一的管理和控制,从而提高系统的运行效率降低系统运行压力;当然了,使用线程池的原因不仅仅只有这些,我们可以从线程池自身的优点上来进一步了解线程池的好处。(1)线程和任务分离,提升线程的重用性。

(2)控制线程的并发数量,降低服务器压力,统一管理所有的线程。

(3)提升系统的响应速度,假如创建线程用的时间为T1,执行任务用的时间为T2,销毁线程用的时间为T3,那么使用线程就免去了T1和T3的时间。

1.5 线程池的应用场景

(1)商品秒杀
(2)云盘文件上传下载
(3)12306 网上购票系统

总之,只要是有并发的地方、任务量大或者小、每个任务执行时间长或短的都可以使用线程池,只不过在使用线程池的时候,注意下设置合理的线程池大小即可;

2.1 实现方式 (springboot实现多线程)

1. 自定义线程池配置,我自己的项目在没有充分的把握情况下一般不修改手脚架的配置,避免出现不明原因。加上我们经理之前也教我,能不修改别人的代码,尽量不修改别人的代码,因为你不确定别人是如何调用的。


/*** xxx业务专用的线程池配置类*/
@Configuration
public class TalentIotThreadConfig  {/*** ThreadPoolTaskExecutor的处理流程* 当池子大小小于corePoolSize,就新建线程,并处理请求* 当池子大小等于corePoolSize,把请求放入workQueue中,池子里的空闲线程就去workQueue中取任务并处理* 当workQueue放不下任务时,就新建线程放入线程池,并处理请求,如果池子大小撑到了maximumPoolSize,就用RejectedExecutionHandler来做拒绝处理* 当池子的线程数大于corePoolSize时,多余的线程会等待keepAliveTime长时间,如果无请求可处理就自行销毁** @return*/@Bean("TalentIotThread")public ThreadPoolTaskExecutor  getAsyncExecutor() {ThreadPoolTaskExecutor tp = new ThreadPoolTaskExecutor();//设置核心线程数tp.setCorePoolSize(10);//设置最大线程数tp.setMaxPoolSize(100);//线程使用的缓冲队列tp.setQueueCapacity(10);//设置程序关闭时要等待线程全部执行完tp.setWaitForTasksToCompleteOnShutdown(true);//设置等待时间,超过等待时间后立即停止tp.setAwaitTerminationSeconds(60);//线程名称前缀tp.setThreadNamePrefix("talent-iot-task-");//初始化线程tp.initialize();return tp;}}

2. 调用,ThreadPoolExecutor它的顶级父类是Executor接口,只包含了一个方法——execute,这个方法也就是线程池的“执行”。


public class IotTimer {//通过注解引入配置@Resource(name = "TalentIotThread")private Executor executor;@Scheduled(cron = "0 */2 * * * ?")void talIotDataShare() {for (TalIotDateShare iotDateShare : shareList) {executor.execute(() -> {// 业务代码                 });}}}

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

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

相关文章

【ROS】fsd_algorithm架构学习与源码分析(致敬)

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍fsd_algorithm架构学习与源码分析。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下&am…

日常BUG——使用Long类型作id,后端返回给前段后精度丢失问题

😜作 者:是江迪呀✒️本文关键词:日常BUG、BUG、问题分析☀️每日 一言 :存在错误说明你在进步! 一、问题描述 数据库long类型Id: 前端返回的Id实体类: Data ApiModel("xxx") public class …

# X11、Xlib、XFree86、Xorg、GTK、Qt、Gnome和KDE之间的关系

X11、Xlib、XFree86、Xorg、GTK、Qt、Gnome和KDE之间的关系 很多人对于他们是啥是傻傻分不清的,我做了个表格供大家参考。 摘抄: X11是X Window System Protocol, Version 11(RFC1013),是X server和X client之间的通…

CMU 15-445 -- Distributed OLTP Databases -20

CMU 15-445 -- Distributed OLTP Databases -20 引言AssumptionAgendaAtomic Commit ProtocolsTwo-Phase Commit (2PC)2PC Success2PC Abort2PC OptimizationsFault Tolerant PaxosMulti-Paxos 2PC vs. Paxos ReplicationReplication ConfigurationApproach #1: Master-Replica…

Java基础入门篇——Java变量类型的转换和运算符(七)

目录 一、变量类型 1.1自动类型转换(隐式转换) 1.2 强制类型转换(显式转换) 1.3类型转换的其他情况 二、运算符 2.1算术运算符 2.2比较运算符 2.3逻辑运算符 2.4位运算符 三、总结 在Java中,变量类型的转换…

Java ThreadLocal是什么

文章目录 引子:SimpleDateFormat类ThreadLocal是什么ThreadLocal 的另一个用途**总结**ThreadLocal的两大用途ThreadLocal 的源代码ThreadLocalMapThreadLocalMap 的问题ThreadLocal的key为什么设置成弱引用?value为什么不是弱引用?Thread、T…

如何让你的视频在 TikTok上变得火爆?

TikTok凭借巨大的用户量和商业价值,它从来不缺优质内容。如何在众多内容中脱颖而出获得关注,这并不简单。和泛流量账号不同,商业账号的目的更加明确,也就是说,商业账号并不一定要以高流量最为唯一的追求目标&#xff0…

跨域+四种解决方法

文章目录 一、跨域二、JSONP实现跨域请求三、前端代理实现跨域请求四、后端设置请求头实现跨域请求五、Nginx代理实现跨域请求5.1 安装Nginx软件5.2 使用Ubuntu安装nginx 本文是在学习课程满神yyds后记录的笔记,强烈推荐读者去看此课程。 一、跨域 出于浏览器的同…

JVM笔记 —— 出现内存溢出错误时时如何排查

一、出现内存溢出的几种情况 内存溢出错误分为StackOverflowError和OutOfMemoryError,前者是栈中出现溢出,后者一般是堆或方法区出现溢出,简称OOM 1. 栈溢出 StackOverflowError 栈溢出一般都是因为没有正确的结束递归导致的,无…

Qt5兼容使用之前Qt4接口 intersect接口

1. 问题 项目卡中遇到编译报错, 错误 C2039 “intersect”: 不是“QRect”的成员 。 2. 排查过程 排查到依赖的第三方代码,使用 intersect 接口, 跟踪排查到头文件中使用了***#if QT_DEPRECATED_SINCE(5, 0)*** #if QT_DEPRECATED_SINCE…

【CSS】CSS 选择器

CSS 选择器 1.基础选择器 1.1 元素选择器 语法:标签名{...} 元素选择器会选中对应标签名的HTML元素,例如:p{...},div{...},span{...}等 1.2 类选择器 语法:.类名{...} 类选择器会选中class属性为指定…

[Idea热部署]两秒钟学会热部署

两者同时适配好,保证没有问题 哈,谢谢各位同志的阅读,然后呢如果觉得本文对您有所帮助的话,还给个免费的赞捏 Thanks♪(・ω・)ノ

【ArcGIS Pro二次开发】(58):数据的本地化存储

在做村规工具的过程中,需要设置一些参数,比如说导图的DPI,需要导出的图名等等。 每次导图前都需要设置参数,虽然有默认值,但还是需要不时的修改。 在使用的过程中,可能会有一些常用的参数,希望…

每天一道leetcode:139. 单词拆分(动态规划中等)

今日份题目: 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。 示例1 输入: s "leetcode", …

【解密算法:时间与空间的博弈】

本章重点 ​​什么是数据结构? 什么是算法? 算法效率 时间复杂度 空间复杂度 常见时间复杂度以及复杂度oj练习 1. 什么是数据结构? 数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系…

Docker 数据管理

文章目录 前言1、Dcoker 文件体系2、volume挂载案例2.1、挂载运行一个容器实例方法1方法2 3、volumes-from 案例4、备份/恢复数据卷5、删除数据卷 前言 为什么要有数据管理? 因为: Docker 是不提供持久化的 ,容器是不稳定的;一个…

TCP 三次握手,四次挥手

1、三次握手 第一次握手 SYN 等于1,SeqX 第二次握手 SYN等于1 ACK等于1,SeqY,AckX1 第三次SYN等于0 ACK等于1,SeqX1,AckY1 ackRow都是对应请求seqraw,三次握手后,Seq就是服务器前一个包中的ac…

【Git】—— 标签管理

目录 (一)理解标签 1、作用 (二)创建标签 (三)操作标签 1、删除标签 2、推送标签 3、删除远程标签 (一)理解标签 标签 tag ,可以简单的理解为是对某次 commit 的…

Java基础篇--运算符

目录 算术运算符 赋值运算符 比较运算符 逻辑运算符 条件运算符(?:) instanceof 运算符 Java运算符优先级 在程序中经常出现一些特殊符号,如、-、*、、>等,这些特殊符号称作运算符。运算符用于对数据进行算术运算、赋值…

flowable-ui部署(6.80)

不使用tomcat直接看最后边 前置条件:Apache Tomcat/9.0.78版本及以下 https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.78/bin/apache-tomcat-9.0.78-windows-x64.zip 一、下载资源 https://github.com/flowable/flowable-engine/releases/download/flowable-6.…