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

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

请求写入内存

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

@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多线程学习处理高并发问题”的内容,希望对大家有所帮助,如有疑问,请在线咨询。

Java多线程学习处理高并发问题相关推荐

  1. Java——使用多线程模拟真实高并发业务并保证安全性(一)

    作者专注于Java.架构.Linux.小程序.爬虫.自动化等技术. 工作期间含泪整理出一些资料,微信搜索[javaUp],回复 [java][黑客][爬虫][小程序][面试]等关键字免费获取资料.技术 ...

  2. Java多线程系列(七):并发容器的原理,7大并发容器详解、及使用场景

    之前谈过高并发编程系列: 高并发编程系列:4种常用Java线程锁的特点,性能比较.使用场景 高并发编程系列:CountDownLatch.Semaphore等4大并发工具类详解 高并发编程系列:4大J ...

  3. java多线程学习笔记。

    java多线程学习笔记 线程的优缺点: 多线程的好处: 充分利用多处理核心,提高资源的利用率和吞吐量. 提高接口的响应效率,异步系统工作. 线程的风险: 安全危险(竞争条件):什么坏事都没有发生.在没 ...

  4. Java多线程学习 (超详细总结)

    Java多线程学习 一.概要 二. JAVA 线程实现/创建方式 2.1 继承Thread 类 2.2 实现 Runnable 接口 2.3 Thread和Runnable的区别 2.4 总结 三.线 ...

  5. Java开发大型互联网高并发架构实战之原理概念分析

    JAVA大飞哥 2019-06-16 21:07:08 引言 高并发是指在同一个时间点,有很多用户同时访问URL地址,比如:淘宝的双11.双12,就会产生高并发.又如贴吧的爆吧,就是恶意的高并发请求, ...

  6. Java多线程学习(二)synchronized关键字(1)

    转载请备注地址: https://blog.csdn.net/qq_34337272/article/details/79655194 Java多线程学习(二)将分为两篇文章介绍synchronize ...

  7. 【转】Java 多线程学习

    原网址:https://www.cnblogs.com/yjd_hycf_space/p/7526608.html Java多线程学习(总结很详细!!!) 此文只能说是java多线程的一个入门,其实J ...

  8. 转:Java多线程学习(总结很详细!!!)

    Java多线程学习(总结很详细!!!) 此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢? 本文主要讲java中多线程 ...

  9. Java多线程学习之路(四)---死锁(DeadLock)

    Java多线程学习之路(四)-死锁(DeadLock) 1.定义 死锁就是多个线程在竞争共享资源的时候,相互阻塞,不能脱身的状态(个人理解).其实死锁一定程度上可以看成一个死循环. 举个现实生活中的例 ...

最新文章

  1. 一文读懂Data Lake的概念、特征、架构与案例
  2. 机器学习笔记的github镜像下载(github个人star数量排名175)
  3. docker启动nginx后挂了_Docker容器部署 Nginx服务
  4. mysql简单外连接查询
  5. 目标检测论文阅读:Multi-scale Location-aware Kernel Representation for Object Detection(CVPR2018)
  6. [转载]QMessageBox 用法_vortex_新浪博客
  7. 计算机图形学(二)——实验二:直线的生成算法
  8. 拓端tecdat|R语言进行相关矩阵分析及其网络可视化
  9. XenServer利用XenCenter配置网络选项
  10. si24r1程序_Si24R1_Si24R1数据手册_2.4G无线射频芯片Si24R1_一牛网
  11. 互联网行业哪个职业比较有前途?
  12. 笔记 |《软件测试技术经典教程》第4章 黑盒测试技术
  13. Win10 锁屏之后无法唤起 出现假死解决办法
  14. C++STL库之algorithm库
  15. ecshop 匿名购买 买家可以自由选择是否匿名购买,仿淘宝匿名购买
  16. 在线教育app开发,教学管理系统的开发方案设计
  17. Json - 学习/实践
  18. 基于SSM实现的求职招聘系统【附源码】(毕设)
  19. 计算机网络名词解释www万维网,网络名词解释
  20. 支付宝 错误信息对照表

热门文章

  1. 2017还有29天,你的目标实现了吗?|内有彩蛋
  2. [PHP] Phalcon操作示范
  3. 顶尖程序员不同于常人的 5 个区别
  4. apache用户认证
  5. jQuery 1.9 移除了 $.browser 的替代方法
  6. 让织梦内容页arclist标签的当前文章标题加亮显示
  7. 解决阿里云无法正常使用samba的问题【转】
  8. laravel5.4 关于数据填充的知识
  9. aidl实现进程间通信
  10. 《Programming WPF》翻译 第7章 3.笔刷和钢笔