高并发模拟~多个线程同时发起请求

2023-11-16

高并发模拟,多个线程同时发起请求

两种方案:

  • CyclicBarrier:栅栏,所有的线程必须同时到达栅栏位置,才能继续执行。
  • CountDownLatch:计数器,一个线程或多个线程一直等待,直到其他线程执行的操作完成。

1、CyclicBarrier

  • 适用在多线程相互等待,直到到达一个屏障点。并且CyclicBarrier是可重用的
  • 下面的列子,设置线程阻塞200个,但发起线程400个,这样会被分为两批,前200个线程相互等待,一起请求,后200个线程相互等待,一起请求。
public class CurrentChatTest {
    
    //定义CyclicBarrier 的屏障,需要等多少个线程到了才发起请求
    CyclicBarrier cyclicBarrier = new CyclicBarrier(200);

    private void runThread() {
    //定义线程池
        ExecutorService executorService = Executors.newFixedThreadPool(400);
     //执行线程
        for (int i = 0; i < 400; i++) {
            executorService.submit(buildThread(i));
        }
    }

    private Thread buildThread(int i) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println("Thread:" + Thread.currentThread().getName() + "准备...");
                    //cyclicBarrier一定要等到满200个线程到了才往后执行
                    cyclicBarrier.await();
                    System.out.println("Thread:" + Thread.currentThread().getName() + "开始执行");
                    //do something

                } catch (Exception e) {
                    e.printStackTrace();
                } 
            }
        });
        thread.setName("name:" + i);
        return thread;
    }

    public static void main(String[] args) {
        CurrentChatTest currentChatTest = new CurrentChatTest();
        currentChatTest.runThread();
    }
}

2、CountDownLatch

CountDownLatch 就是一个计数器,让所有的线程等待,直到计数器的值为0时才让线程执行。

public class CurrentChatTest {

    //定义一个CountDownLatch
    CountDownLatch countDownLatch = new CountDownLatch(1);
    
  public void countDownLatch() {
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        for (int i = 0; i < 10; i++) {
            executorService.submit(createThread());
        }
        //计数器减一
        countDownLatch.countDown();
    }

    //创建线程
    private Thread createThread() {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println("Thread: "+Thread.currentThread().getName()+", 准备...");
                    countDownLatch.await();
                    //do something
                    System.out.println("Thread: "+Thread.currentThread().getName()+", 开始...");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        return thread;
    }

    public static void main(String[] args) {
        CurrentChatTest currentChatTest = new CurrentChatTest();
        currentChatTest.countDownLatch();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

高并发模拟~多个线程同时发起请求 的相关文章

  • CountDownLatch 、ReentryLock、CyclicBarrier 、ReadWriteLock 、Semaphore、Exchanger、LockSupport

    CountDownLatch 又叫门栓 xff0c 初始化设置一个值 xff0c 当这个值等于0时 xff0c 是否锁 span class token keyword private span span class token keywo
  • Java多并发(六)

    文章目录 线程池 1 池化技术的优点 2 线程池的核心底层实现的相关参数 1 corePoolSize 线程池的基本大小 2 maximumPoolSize 线程池最大数量 3 runnableTaskQueue 任务队列 4 Reject
  • 内存屏障(cpu内存屏障 与java内存屏障)

    文章目录 CPU 内存屏障 定义 读写屏障指令 为什么会出现内存屏障 java内存屏障 java内存屏障存在意义 java中内存屏障的主要类型 LoadLoad 屏障 StoreStore 屏障 LoadStore 屏障 StoreLoad
  • golang基于errgroup实现并发调用

    文章目录 串行调用 基于sync WaitGroup实现简单的并发调用 基于errgroup Group实现并发调用 总结 串行调用 在用go编写web rpc服务器的时候 经常会出现需要对下游多 个 组 服务调用rpc 或者其他比较耗时的
  • Tomcat 线程池

    目录 概述 tomcat线程池工作原理 关键源码 Connector 配置 Executor 线程配置 tomcat核心组件 题外 概述 Tomcat 是一个流行的 Java Web 服务器 它使用线程池来处理客户端请求 线程池是一组预先创
  • Java高并发- 锁的优化及 JVM 对锁优化所做的努力

    在高并发环境下 激烈的锁竞争会导致程序的性能下降 所以我们有必要讨论一下有关 锁 的性能问题及注意事项 如 避免死锁 减小锁粒度 锁分离等 一 锁优化 1 1 减小锁持有时间 在锁竞争过程中 单个线程对锁的持有时间与系统性能有着直接的关系
  • brpc源码解析(十六)—— 作为client的连接建立和处理详解

    文章目录 一 连接方式的定义 二 连接方式的选择 三 获取用于连接的socket 3 1 获取指代具体下游服务的tmp socket 3 2 根据tmp socket获取用于发送数据的socket 3 3 连接以准备发送 四 数据发送完毕后
  • 全到哭,阿里新产2023版Java架构核心宝典,涵盖Java进阶所有主流技术

    导言 什么是架构师 对于程序员来说 聊架构是一个永不过时的话题 实际上 每一家公司都有自己对架构师不同的定位 因为不同的公司 所处的阶段 业务模式以及应用场景都不一样 因此对架构师的要求不一样 所以定位也就不同 但是 无论如何 架构师除了优
  • 如何解决高并发,秒杀问题

    相信不少人会被这个问题困扰 分享大家一篇这样的文章 希望能够帮到你 一 秒杀业务为什么难做 1 im系统 例如qq或者微博 每个人都读自己的数据 好友列表 群列表 个人信息 2 微博系统 每个人读你关注的人的数据 一个人读多个人的数据 3
  • java对象的内存模型详解:内存模型及对象头的奥秘

    在面试官的因势利导下 很多人对jvm的内存模型已经耳熟能详 但是对我们经常new 出来的对象 比如new Object 你了解它的内存模型吗 本篇文章将带你走进对象内部 真正去了解这个你最熟悉 也最不熟悉的的对象 一 对象的内存模型 先上图
  • 【java】高并发之限流 RateLimiter使用

    1 概述 转载原文 高并发之限流 你可能知道高并发系统需要限流这个东西 但具体是限制的什么 该如何去做 还是模凌两可 我们接下来系统性的给它归个小类 希望对你有所帮助 google guava中提供了一个限流实现 RateLimiter 这
  • Redis单机版全面讲解

    目录 常识 什么是redis redis为什么快 redis作为实例安装在系统中 redis数据类型 redis命令 String类型相关命令 list类型相关命令 hash类型相关命令 set类型相关命令 zset类型相关命令 redis
  • java高并发的处理--锁机制

    对于我们开发的网站 如果网站的访问量非常大的话 那么我们就需要考虑相关的并发访问问题了 而并发问题是绝大部分的程序员头疼的问题 但话又说回来了 既然逃避不掉 那我们就坦然面对吧 今天就让我们一起来研究一下常见的并发和同步吧 为了更好的理解并
  • Redis分布式锁----乐观锁的实现,以秒杀系统为例

    摘要 本文使用redis来实现乐观锁 并以秒杀系统为实例来讲解整个过程 本文源码请在这里下载 https github com appleappleapple DistributeLearning 乐观锁 大多数是基于数据版本 versio
  • JAVA并发-Monitor简介

    什么是Monitor 1 Monitor是一种用来实现同步的工具 2 与每个java对象相关联 即每个java对象都有一个Monitor与之对应 3 Monitor是实现Sychronized 内置锁 的基础 Monitor的基本结构是什么
  • 分布式系统---幂等性设计

    分布式系统 幂等性设计 WEB资源或API方法的幂等性是指一次和多次请求某一个资源应该具有同样的副作用 幂等性是系统的接口对外一种承诺 而不是实现 承诺只要调用接口成功 外部多次调用对系统的影响是一致的 幂等性是分布式系统设计中的一个重要概
  • 如果老板要求你的系统接入春晚大流量活动,你会心慌慌吗?

    目录 回头看看 原始系统技术架构 基于CDN的活动静态页面缓存方案 基于Nginx Tomcat Redis的多级缓存方案 超高并发写请求RocketMQ削峰填谷方案 系统限流防雪崩体系架构方案 今天给大家分享一个话题 就是如果要是你老板突
  • 4.OpenResty系列之Nginx负载均衡

    1 负载均衡配置 上篇文章中 代理仅仅指向一个服务器 但是 网站在实际运营过程中 大部分都是以集群的方式运行 这时需要使用负载均衡来分流 nginx 也可以实现简单的负载均衡功能 假设这样一个应用场景 将应用部署在 192 168 1 11
  • Java 并发:倒数锁存器与循环屏障

    我正在阅读java util concurrent API http download oracle com javase 6 docs api java util concurrent package summary html 并发现 C
  • 我的代码线程不安全吗?

    我编写了代码来理解 CyclicBarrier 我的应用程序模拟选举 每轮选出得票少的候选人 该候选人从竞争中淘汰以获得胜利 source class ElectoralCommission public volatile boolean

随机推荐

  • 指针和引用的区别

    从概念上讲 指针从本质上讲就是存放变量地址的一个变量 在逻辑上是独立的 它可以被改变 包括其所指向的地址的改变和其指向的地址中所存放的数据的改变 而引用是一个别名 它在逻辑上不是独立的 它的存在具有依附性 所以引用必须在一开始就被初始化 而
  • Kafka传输数据到Spark Streaming通过编写程序java、scala程序实现操作

    一 案例说明 现有一电商网站数据文件 名为buyer favorite1 记录了用户对商品的收藏数据 数据以 t 键分割 数据内容及数据格式如下 二 前置准备工作 项目环境说明 Linux Ubuntu 16 04 jdk 7u75 lin
  • segment anything原来可以这么玩

    Segment Anything能给我们做什么 前言 内容 具体实现 成果 前言 最近 大模型的热度确实是非常非常的高 从chatgpt到segment anything 这些东西整的我这刚入门的小白确实有点懵逼 最近实在是不知道干啥 想想
  • TypeScript装饰器原理分析

    文章目录 1 前言 2 装饰器原理 2 1 类装饰器 2 2 属性饰器 2 3 方法装饰器 访问器set get也属于方法 2 4 参数装饰器 3 装饰器执行顺序 1 前言 TypeScript装饰器装饰器是一种特殊类型的声明 它能够被附加
  • python numpy中mgrid使用方法

    import numpy as np 基本介绍 np mgrid start end Sj 上述表达中start表示开始数 end表示结束数 Sj表示总共个数 实例 生成的数组是包含end和start这两个数的 np mgrid start
  • 如何在ParaView中使用编程对不同的切面进行积分计算并保存输出?

    如何在ParaView中使用编程对不同的切面进行积分计算并保存输出 ParaView是一个强大的可视化和数据处理工具 它可以通过编程方式自动化各种任务 在此教程中 我们将讨论如何使用ParaView的Python编程接口来对不同的切面进行积
  • 谈谈我对redis事务的理解

    redis事务的所有命令都是序列化 有序地执行 在事务的执行过程中 不会被其他客户端发送的命令所打断 事务的主要作用就是串联所有命令防止其他命令插队 redis事务有几个常用的命令 首先是multi命令 它标记着事务的开始 意思是将命令入命
  • 恒源云GPU租用保姆级教程,助力深度学习训练!

    文章来源 恒源云社区 专注人工智能 深度学习GPU免费加速平台 官方体验网址 https gpushare com 恒源云史上最全的平台使用教程诞生了 用实力证明咱们能唱能跳产品好用 助力大家AI训练 跑赢开学季 必看篇 初次使用恒源云的用
  • golang flag 包的使用指北

    说起 golang 的 flag 个包 我们第一反应的是什么呢 至少我曾经第一次看到 flag 包的时候 第一反应是想起写 C 语言的时候咱们用于定义一个表示的 我们一般会命名为 flag 变量 实际上 golang 的 flag 包是用于
  • 无法定位软件包问题

    在etc apt 的sources list 添加镜像源 deb http archive ubuntu com ubuntu trusty main universe restricted multiverse 然后 sudo apt g
  • 数据分析报告概述

    一 结构规范及写作 报告常用结构 1 架构清晰 主次分明 数据分析报告要有一个清晰的架构 层次分明能降低阅读成本 有助于信息的传达 虽然不同类型的分析报告有其适用的呈现方式 但总的来说作为议论文的一种 大部分的分析报告还是适用总 分 总 的
  • 拜占庭将军问题 原文翻译

    拜占庭将军问 作者 LESLIE LAMPORT ROBERT SHOSTAK 和 MARSHALL PEASE 斯坦福国际研究院 译者 校对 闵敏 裴奇 Elisa EthFans org 可靠的计算机系统必须具备处理故障组件的能力 以防
  • nginx反向代理ipv6网站,使其可被ipv4访问

    环境 ubuntu 18 04 1 主机本身ipv6 v4双栈 0 安装nginx sudo apt get install nginx 1 编辑nginx conf sudo vi etc nginx nginx conf 在http 段
  • 镜像下载boot.iso和dvd1.iso的区别;dnf:找不到命令;yum和dnf的区别;CentOS Stream和Linux的区别;dnf: command not found

    这里写目录标题 一 linux 的各个系列 二 End dates are coming in 2024 for CentOS Stream 8 and CentOS Linux 7 三 镜像下载boot iso和dvd1 iso的区别 四
  • [USB 3.0 报错]-高手必看!BIOS 设置中的 xHCI 模式以及 USB 2.0/3.0 的万能 Windows 驱动

    目录 关于 USB 3 0 报错符合 USB xHCI 的主机控制器 错误代码为 10 一个匪夷所思的 USB 3 0 问题 这种情况会导致哪些症状呢 破案了 这个困扰我大半年的问题其实是 intel xHCI 模式的设置问题 初识 xHC
  • 跳转控制语句

    跳转控制语句 continue 用在循环中 基于条件控制 跳过某次循环体内容的执行 继续下一次的执行 break 用在循环中 基于条件控制 终止循环体内容的执行 也就是说结束当前的整个循环 实例 public class ControlDe
  • 新手怎么做期货?一文让你找到方向

    改革开放40年以来 我国经济水平发展逐年上升 人均收入逐年增长 金融衍生品交易市场也随之逐渐繁荣 越来越多的投资者开始走进期货投资市场 其中不乏有新手不知道怎么炒期货 第一 首先要做的功课是了解自己的个性 做期货不是光靠技术 如果成功按10
  • 使用nps内网穿透的问题记录

    实现目标 将局部网 可访问互联网 设备的端口映射到公网服务器上 1 资料准备 下载nps server 和npc client 安装包 https github com ehang io nps releases 文档 https ehan
  • SpringCloud-消息驱动

    消息驱动 Spring Cloud Stream 概述 常见MQ 消息中间件 ActiveMQ RabbitMQ RocketMQ Kafka 有没有一种新的技术诞生 让我们不再关注具体MQ的细节 我们只需要用一种适配绑定的方式 自动的给我
  • 高并发模拟~多个线程同时发起请求

    高并发模拟 多个线程同时发起请求 两种方案 CyclicBarrier 栅栏 所有的线程必须同时到达栅栏位置 才能继续执行 CountDownLatch 计数器 一个线程或多个线程一直等待 直到其他线程执行的操作完成 1 CyclicBar