一段简单代码理解异步请求消息队列在高并发环境中的作用
来源:互联网 发布:js多文件上传 编辑:程序博客网 时间:2024/05/22 06:15
普通同步方法被调用模拟
package top.yuyufeng.mq;import java.util.Random;import java.util.concurrent.atomic.AtomicInteger;/** * Created by yuyufeng on 2017/8/29. */public class MyServer { private static AtomicInteger atomicInteger = new AtomicInteger(1); public static void createOrder(String product) { int res = atomicInteger.getAndIncrement(); if (res >= 10) { System.err.println("超过当前容量(10) " + res); } System.out.println(product + "当前正在处理的线程数 " + res); doJob(); atomicInteger.getAndDecrement(); } private static void doJob() { Random random = new Random(); long sleepTime = random.nextInt(10) * 100; try { Thread.sleep(sleepTime); } catch (InterruptedException e) { e.printStackTrace(); } } public static void main(String[] args) { //模拟发起请求 并发一旦上去,就会超过限制大小,有宕机危险 for (int i = 0; i < 12; i++) { new Thread() { @Override public void run() { for (int j = 0; j < 10; j++) { MyServer.createOrder(Thread.currentThread().getName()); } System.out.println(Thread.currentThread().getName() + "结束:" + atomicInteger); } }.start(); } }}
运行这段代码之后,你会看到,并发一单上去,当前处理的进程会超过额定容量(这里设置为最高能应对10个进程同时处理,超过会卡顿)
应用消息队列后,变成异步请求
package top.yuyufeng.mq;import java.util.Queue;import java.util.Random;import java.util.concurrent.ConcurrentLinkedQueue;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.atomic.AtomicInteger;/** * Created by yuyufeng on 2017/8/29. */public class MyServerByQuene { private static AtomicInteger atomicInteger = new AtomicInteger(); //这里使用jdk队列,代替常用的消息队列服务 private static Queue<String> queue = new ConcurrentLinkedQueue<>(); private static ExecutorService threadPoolExecutor = Executors.newFixedThreadPool(10); public static void createOrder(String product) { queue.add(product); } static { //10个进程阻塞处理请求 for (int i = 0; i < 10; i++) { threadPoolExecutor.execute(new Runnable() { @Override public void run() { while (true) { String product = queue.poll(); if (product != null) { int res = atomicInteger.getAndIncrement(); if (res >= 10) { System.err.println("超过当前容量(10) " + res); } System.out.println(product + "当前正在处理的线程数 " + res); doJob(); atomicInteger.getAndDecrement(); } else { try { Thread.sleep(1000); System.out.println("MyServerByQuene.run 正在监听...当前进程数量: " + atomicInteger); } catch (InterruptedException e) { } } } } }); } } private static void doJob() { Random random = new Random(); long sleepTime = random.nextInt(10) * 100; try { Thread.sleep(sleepTime); } catch (InterruptedException e) { e.printStackTrace(); } } public static void main(String[] args) { //模拟发起请求,这里的并发更大 ,但是是异步消息队列,会等待处理.能抗住高并发 for (int i = 0; i < 20; i++) { new Thread() { @Override public void run() { for (int j = 0; j < 10; j++) { MyServerByQuene.createOrder(Thread.currentThread().getName() + j); } System.out.println(Thread.currentThread().getName() + "结束:" + atomicInteger); } }.start(); } }}
运行之后,你会发现,无论多少个线程去请求,总的正在处理线程的数量不会变.
这就是消息队列,异步请求在高并发环境下所起的作用
阅读全文
1 0
- 一段简单代码理解异步请求消息队列在高并发环境中的作用
- PHP中利用redis实现消息队列处理高并发请求--简洁代码实现效果
- 消息队列处理高并发
- 简单理解异步、线程池和队列的作用
- 队列在Http请求中的一点理解
- Android异步通信机制简单地理解,Handler是当前线程的消息队列中的一个子队列,而Runable是可以被安排到Handler去运行的接口。 首先在Activity中创建一个继承自Han
- 自己觉得比较有用的WindowsPhone7 Http异步请求的一段简单代码
- PHP中利用redis实现消息队列处理高并发请求
- PHP中利用redis实现消息队列处理高并发请求
- ajax异步请求高并发处理
- Redis和请求队列解决高并发
- 高并发的简单理解
- 在Linux环境中用模拟Windows中的线程消息队列
- 理解osIII中的消息队列
- notify和wait在消息队列中的简单应用
- 消息队列Active mq在Maven项目中的简单使用
- 编写高质量OC代码52建议总结:11.理解objc_msgSend的作用(消息机制)
- 串行队列/并发队列&异步任务/同步任务代码演练
- 微信小程序开发(入坑之旅)一:域名问题。
- OpenCV中phase函数计算方向场
- 《AppIntent
- 袋鼠过河
- JAXB实现JavaBean与XML互相转换
- 一段简单代码理解异步请求消息队列在高并发环境中的作用
- Android开发,自定义ViewGroup的神器,ViewDragHelper
- WebService到底是什么?
- 排序&&单链表反转
- seajs学习
- 记录Qt+VS开发过程中遇到的问题
- c语言之链表学习小结
- sklearn 的基本机器学习(分类方法)
- [剑指offer]镜像二叉树