当前位置: 首页 > 编程日记 > 正文

Java多线程学习处理高并发问题

在程序的应用程序中,用户或请求的数量达到一定数量,并且无法避免并发请求.由于对接口的每次调用都必须在返回时终止,因此,如果接口的业务相对复杂,则可能会有多个用户.调用接口时,该用户将冻结.

1

以下内容将介绍解决此问题的巧妙且非常简单的方法.

请求写入内存

2

我们可以将每个请求封装为一个对象,然后将其写入内存.

@Getter
@Setter
private static class CallVo{//请求对象
private Long param1;//参数1
private Integer param2;//参数2
}
private List<CallVo> callVoList = new ArrayList<>();//请求对象列表
/**
* 接口调用
* @param callVo
* @return
*/
@Transactional
@RequestMapping(value = "/call",method = {RequestMethod.POST})
public void call(@RequestBody CallVo callVo){
synchronized (syncObject) {
callVoList.add(callVo);//将请求对象写入内存
}
}
多线程处理

创建一个线程以继续读取内存中的数据. 如果被请求对象的收集长度为0多线程技术问题解决,则表明没有请求. 如果集合中有数据,请从集合中删除请求的对象并获取时间. 根据相应业务处理请求的参数.

这达到了将同步转变为异步的目的,并简单地解决了高并发性的问题.

private Thread thread;
private final Object syncObject = new Object(); // 同步对象
private volatile boolean runnable;
@Override
public void run() {
while (runnable){
try {
if (callVoList.size() == 0) {//集合长度为0,证明没有请求
Thread.sleep(1000);
continue;
}
CallVo callVo;
synchronized (syncObject) {
callVo = callVoList.remove(0);
}
Long param1 = callVo.getStationId();
Integer param2 = callVo.getCallType();

//业务处理
System.out.println(param1+"---"+param2);

}catch (Exception e){
logger.error("接口调用异常:", e);
}
}
}

完整代码:

@RestController
@Slf4j
@RequestMapping("/erpRemote")
public class ErpRemoteController extends BaseController implements DisposableBean, Runnable{

ErpRemoteController(){
callVoList = new ArrayList<>();
runnable = true;
thread = new Thread(this);
thread.start();
}
/**
* 接口调用
* @param callVo
* @return
*/
@Transactional
@RequestMapping(value = "/call",method = {RequestMethod.POST})
public GeneralResponse call(@RequestBody CallVo callVo){

synchronized (syncObject) {
callVoList.add(callVo);//将请求对象写入内存
}
return GeneralResponse.success(null);
}
@Getter
@Setter
private static class CallVo{//请求对象
private Long param1;//参数1
private Integer param2;//参数2
}
private List<CallVo> callVoList;
private Thread thread;
private final Object syncObject = new Object(); // 同步对象
private volatile boolean runnable;
@Override
public void run() {
while (runnable){
try {
if (callVoList.size() == 0) {//集合长度为0,证明没有请求
Thread.sleep(1000);
continue;
}
CallVo callVo;
synchronized (syncObject) {
callVo = callVoList.remove(0);
}
Long param1 = callVo.getStationId();
Integer param2 = callVo.getCallType();

//业务处理
System.out.println(param1+"---"+param2);

}catch (Exception e){
logger.error("接口调用异常:", e);
}
}
}
@Override
public void destroy() {
runnable = false;
}
}
限制

由于同步是异步的,因此每次请求接口的返回值都是唯一的多线程技术问题解决,因此此方法仅适用于请求者不需要返回的情况.

以上就是小编介绍的“java培训教程:Java多线程学习处理高并发问题”的内容,希望对大家有所帮助,如有疑问,请在线咨询。

相关文章:

防止表单多次提交

防止表单多次提交 //jQuery①<script type"text/javascript"> $("input:submit").each(function() { var srcclick $(this).attr("onclick"); if(typeof(srcclick)"function"){ $(this).click(function() { if (srcclick()) { …

Visual Studio环境变量使用实例:使用环境变量来组织project

前言 在前一篇文章Visual Studio中的环境变量(以Visual Studio 2013为例)中介绍了VS中的环境变量&#xff0c;本文将以实际样例说明怎样合理使用这些环境变量来组织VCproject。使用vs环境变量来组织project 通常一个解决方式包括多个项目。这些项目相互之间可能存在依赖关系。以…

股市币市:数据分析与交易所最新公告(20190301)

沪深300 1. 沪深300分位数数据 2. 沪深300股指图 3. 沪深300分位数图 4. 沪深300筹码分布图 数据来源&#xff1a; https://finance.sina.com.cn/stock/ BTC比特币 1. 比特币分位数数据 2. 比特币交易图 3. 比特币分位数图 4. 比特币筹码分布图 数据来源&#xff1a; https…

Python常用6个技术网站汇总分享!

Python是一门面向对象的编程语言&#xff0c;它具有丰富和强大的库&#xff0c;能够把用其他语言编写的各种模块轻松地联结在一起&#xff0c;因此也常被称为“胶水语言”。Python技术会随着互联网的不断发展一直迭代和更新&#xff0c;所以需要Python开发的人员一直保持一个学…

devstack —— 单机部署 OpenStack 体验

2019独角兽企业重金招聘Python工程师标准>>> devstack 是一个用来快速部署 OpenStack 的脚本。 使用非常简单&#xff0c;执行 ./stack.sh 即可&#xff0c;但是在安装过程中遇到一些问题会中断&#xff0c;通过不断修正尝试&#xff0c;事后在这里记录一下&#xf…

使用ultraedit和cl编译器打造简易c/c++开发环境

在visual c下&#xff0c;每编写一个简单的小程序&#xff0c;就得生成一大串中间文件&#xff0c;另人十分的不爽。下面提供一个新的编写c/c程序的方法&#xff1a;   &#xff08;1&#xff09;&#xff0c;下载utraledit-32编辑器&#xff0c;推荐v11.  &#xff08;2&a…

股市币市:数据分析与交易所最新公告(20190302)

BTC比特币 1. 比特币分位数数据 2. 比特币交易图 3. 比特币分位数图 4. 比特币筹码分布图 数据来源&#xff1a; https://coinmarketcap.com/currencies/bitcoin/ 数字货币交易所公告 BigOne 2019/03/01 BigONE 用户体验月&#xff1a;有奖寻建议 &#xff0c;重金找 BUG …

分享五款java学习辅助工具,总有你用的上的~

想要学好java技术&#xff0c;除了自身的努力&#xff0c;辅助工具也不缺少&#xff0c;辅助工具可以帮助大家在今后的工作中可以提高工作效率&#xff0c;下面小编就来分享五款java学习辅助工具&#xff0c;总有你用的上的~ 五款java学习辅助工具&#xff1a; 1、Eclipse Ecli…

如何利用 C# 爬取「猫眼电影专业版:票房」数据!

在现代生活中&#xff0c;看电影已经成为大家的一种休闲方式。 前几天&#xff0c;我们介绍了 如何利用 C# 爬取「猫眼电影&#xff1a;热映口碑榜」及对应影片信息&#xff01;&#xff0c;通过这份“热映口碑”榜单&#xff0c;我们可以看到大家对当前热播电影的评价&#x…

MOSS的CSS样式说明,一个老外总结的

MOSS的CSS样式说明&#xff0c;一个老外总结的 http://www.heathersolomon.com/content/sp07cssreference.htm 转载于:https://www.cnblogs.com/greeny/archive/2010/09/03/1817027.html

什么是整型?Python整型详细介绍

整数类型(int)简称整型&#xff0c;它用于表示整数&#xff0c;例如&#xff0c;100、2016等。整型字面值的表示方式有四种&#xff0c;分别是十进制、二进制(以“0B”或“0b”开头)、八进制(以数字“0”开头)和十六进制(以“0x”或“0X”开头)。 Python的整型可以表示的范围是…

hibernate.hbm2ddl.auto的value

Hibernate 配置参数hibernate.hbm2ddl.auto Hibernate中的配置文件&#xff1a; <properties> <property name"hibernate.hbm2ddl.auto" value"create" /> </properties> 参数说明&#xff1a; validate 加载hibernate时…

linux的管道

1 管道的本质是进程间通信的一种手段 这个命名是非常形象的&#xff0c;数据从管道的一端流向管道的另外一端&#xff0c;然后另外一个进程等在那里&#xff0c;只要有数据了就进行处理。 2 管道连接的多个命令是同时启动的 也就是说&#xff0c;管道连接的多个命令的进程之间是…

股市币市:数据分析与交易所最新公告(20190303)

BTC比特币 1. 比特币分位数数据 2. 比特币交易图 3. 比特币分位数图 4. 比特币筹码分布图 数据来源&#xff1a; https://coinmarketcap.com/currencies/bitcoin/ 产品进程 赚钱是刚需&#xff0c;如何正确的交易股票&#xff1f;「股票数据分析软件」的开发&#xff08;上&…

零基础怎么学习web前端开发

零基础怎么学习web前端开发?web前端在移动互联网行业的运用是非常广泛的&#xff0c;而且web前端开发技术所涵盖的知识有很多&#xff0c;具体要怎么学习&#xff0c;来看看小编下面的详细介绍吧。 零基础怎么学习web前端开发?对零基础学员来说&#xff0c; web前端要学习的知…

【DocFX文档翻译】DocFX 入门 (Getting Started with DocFX)

DocFX 入门 1. DocFX 是什么&#xff1f; DocFX 是一个基于.NET的API文档生成器&#xff0c;当前支持 C# 和 VB。 它可以通过你的代码中的三斜杠注释生成 API 参考文档。同样也支持你使用 Markdown 文件创建一些其他的主题文档&#xff08;例如&#xff1a;教程以及使用手册&am…

在Ubuntu上安装Snort入侵检测系统。

转载于:https://www.cnblogs.com/onlyzq/archive/2010/09/10/1823079.html

一份来自山东院校的考研调剂系统已开放名单!

距离 19 考研初试成绩的公布已经有一段时间了&#xff0c;成绩不错的同学就安心准备复试吧&#xff0c;全力备考&#xff0c;一定要拿到属于你的录取通知书&#xff01;成绩不满意&#xff0c;擦线或者排名靠后的同学&#xff0c;复试、调剂两手准备&#xff0c;注定咱们要花更…

适合初学者学java技术的书籍推荐!

想要学会java技术&#xff0c;光靠听课是不够的&#xff0c;看书也是非常重要的一步&#xff0c;以下小编为大家推荐的是适合初学者学java技术的书籍&#xff0c;希望能够给初学者们带来帮助。 适合初学者学java技术的书籍推荐! 1. Java编程思想(第4版) 本书赢得了全球程序员的…

ref和out的区别

ref和out的区别在C# 中&#xff0c;既可以通过值也可以通过引用传递参数。通过引用传递参数允许函数成员更改参数的值&#xff0c;并保持该更改。若要通过引用传递参数&#xff0c; 可使用ref或out关键字。ref和out这两个关键字都能够提供相似的功效&#xff0c;其作用也很像C中…

如何利用 C# 爬取「当当 - 计算机与互联网图书销量榜」!

前段时间我们介绍了如何利用 C# 语言来爬取“京东 - 计算机与互联网图书销量榜” 网页的方法&#xff0c;通过该方法&#xff0c;我们能够获得“京东”的图书销售排行榜数据。 可是&#xff0c;读书相当于给我们的大脑喂料&#xff0c;只有输入的是精华&#xff0c;才会有更好…

【Java学习笔记之十】Java中循环语句foreach使用总结及foreach写法失效的问题

foreach语句使用总结增强for(part1:part2){part3}; part2中是一个数组对象,或者是带有泛性的集合. part1定义了一个局部变量,这个局部变量的类型与part2中的对象元素的类型是一致的. part3当然还是循环体. foreach语句是java5的新特征之一&#xff0c;在遍历数组、集合方面&…

参加软件测试培训需要学什么技术

软件测试这项技术在几年可谓是风头正盛&#xff0c;很多人都想要跳槽到这个行业&#xff0c;那么就需要学会软件测试技术&#xff0c;那么目前参加软件测试培训需要学什么技术呢?来看看下面的详细介绍吧。 参加软件测试培训需要学什么技术? 每个软件在上线之前都离不开重重测…

程序集和应用程序域

这两个概念是DotNet程序员经常见到的&#xff0c;但好多人搞不清它们。虽然MSDN对它们有相关的说明&#xff0c;但并不是那么容易看懂。在这里灰灰虫根据自己的理解用简单易懂的语言解绍一下它们。程序集(assembly) “程序集是包含编译好的、面向.NET Framework的代码的逻辑…

股市币市:数据分析与交易所最新公告

投资原则&#xff1a; 极端牛市是攒钱的时候&#xff08;分位数达到100&#xff09;&#xff0c;极端熊市是攒票的时候&#xff08;分位数低于40%&#xff09;&#xff0c;股指已经屡创新高&#xff0c;你再不攒钱就不对了&#xff0c;同理&#xff0c;股指屡创新低&#xff0c…

OpenGL学习(hello)

#include <gl/glut.h>void display(void){glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓冲以及深度缓冲glColor3f(1.0, 1.0, 1.0);glBegin(GL_POLYGON); // 绘画開始话多边形/*glVertex3f(0.25, 0.25, 0.0);glVertex3f(0.75, 0.25, 0.0);glVertex3f(0.75, 0.75, 0.0);glV…

选择python培训机构的关键考核五大因素,让你永不吃亏!

近几年&#xff0c;对于Python技术在人工智能领域的广泛使用&#xff0c;想要学习Python技术的人越来越多&#xff0c;市面上的Python培训机构也多了起来&#xff0c;如何选择适合的Python培训机构成了困扰大家的问题&#xff0c;下面小编就我大家详细的解析一下选择python培训…

Maven 的classifier的作用

直接看一个例子&#xff0c;maven中要引入json包&#xff0c;于是使用了 <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <version>2.2.2</version> </dependency> 可是&#xff0c;当…

NPOI 导出Excel

找到dll文件引用 using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using System; using System.IO;namespace NPOI.WriteExcel {class Program{/*NPOI.DLL&#xff1a;NPOI 核心函式庫。NPOI.DDF.DLL&#xff1a;NPOI 繪圖區讀寫函式庫。NPOI.HPSF.DLL&#xff1a;NPOI 文…

如何利用 C# 实现 K 最邻近算法?

众所周知&#xff0c;电影可以按照题材分类&#xff0c;然而题材本身是如何定义的&#xff1f;由谁来判定某部电影属于哪个题材&#xff1f;也就是说同一题材的电影具有哪些公共特征&#xff1f;这些都是在进行电影分类时必须要考虑的问题。没有哪个电影人会说自己制作的电影和…