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

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(使用前将#替换为@)

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

  • iocp之简单实现

    一 步骤 二 代码 1 头文件 include
  • tomcat内存(jvm)、并发、缓存优化

    内存调优 rem次调整为高并发内存调优 rem 以下配置为JVM参数调优 set JAVA OPTS server rem 以服务器模式启动 启动速度慢 但更稳定 性能更好 Xms8192M rem 由于本机内存为16G 这里就设置成8G
  • 内存屏障(cpu内存屏障 与java内存屏障)

    文章目录 CPU 内存屏障 定义 读写屏障指令 为什么会出现内存屏障 java内存屏障 java内存屏障存在意义 java中内存屏障的主要类型 LoadLoad 屏障 StoreStore 屏障 LoadStore 屏障 StoreLoad
  • ConcurrentHashMap详解

    目录 ConcurrentHashMap介绍 ConcurrentHashMap底层数据结构 ConcurrentHashMap部分分析 ConcurrentHashMap与HashMap HashTable的区别 源码为jdk1 7 Co
  • 高并发优化实战-连接数满载

    1 第三方http请求处理 finally httpclient getConnectionManager shutdown 2 linux服务器tcp处理 端口释放后的等待时间 默认为60s sysctl w net ipv4 tcp f
  • 【Java并发】FutureTask-Callable设置接口超时限制

    目录 代码 运行 代码 原理是新建一个Callable线程 call方法可以返回对象 用FutureTask封装后 通过future对象的get方法来设定超时限制 如果超时 则future cancel true 取消执行 重写Callab
  • Java并发工具之CyclicBarrier

    一 简介 摘自 Java并发编程的艺术 一书中 CyclicBarrier的字面意思是可循环使用 Cyclic 的屏障 Barrier 它要做的事情是 让一组线程到达一个屏障 也可以叫同步点 时被阻塞 直到最后一个线程到达屏障时 屏障才会开
  • 高并发解决方案相关面试题

    什么是DNS解析域名 DNS域名解析就是讲域名转化为不需要显示端口 二级域名的端口一般为80 的IP地址 域名解析的一般先去本地环境的host文件读取配置 解析成对应的IP地址 根据IP地址访问对应的服务器 若host文件未配置 则会去网络
  • Java请求合并与分而治之

    在系统设计的时候 你是否也遇到过这两个问题 1 大量请求造成数据库压力过大 2 大量数据库查询造成请求执行时间过长 本文将介绍在高并发 大数据环境下 以上两种问题的应对思路 一 请求合并 首先思考一个场景 在高并发的系统中 在每秒内有大量的
  • 【Java小实验】【Java并发】使用线程池按行并发取二维数组最大值

    使用线程池按行并发取二维数组最大值 生成二维数组 使用Callable实现线程 使用Runnable获取线程 快手后端二面问题 由于网上直接搜竟然没有搜出来 自己写了一下 生成二维数组 生成二维数组的公共类 class RandomArra
  • 【Java并发】生产者消费者模型 - 两线程交替打印1-100

    生产者消费者模型 以下是其中一种通过synchronize的实现 import java util Queue import java util LinkedList public class ProducerAndConsumer pri
  • 搞定高并发系列:如何设计一个高并发系统

    如何设计一个高并发系统 现在这个是每个架构师都需要考虑的问题 当然每个人面对的业务场景都不一样 这里我们纯粹从技术角度探讨 我总结了下 要点如下 负载均衡 缓存优先 服务拆分 系统拆分 冗余扩容 削峰限流 熔断降级 分库分表 读写分离 一
  • Redis优化秒杀系统

    Redis优化秒杀系统 使用背景 普通的基于mss框架的系统在并发量不是很高的情况下 对redis的需求不是很高 redis在系统中的角色相当于一个对象缓存器 在高并发的系统中 比如秒杀系统 在某一刻对数据库中的一条数据可能是成千上万的用户
  • Java并发编程之CyclicBarrier详解

    简介 栅栏类似于闭锁 它能阻塞一组线程直到某个事件的发生 栅栏与闭锁的关键区别在于 所有的线程必须同时到达栅栏位置 才能继续执行 闭锁用于等待事件 而栅栏用于等待其他线程 CyclicBarrier可以使一定数量的线程反复地在栅栏位置处汇集
  • 微服务架构跨库分页解决的四种方案

    微服务架构是一项在云中部署应用和服务的新技术 大部分围绕微服务的争论都集中在容器或其他技术是否能很好的实施微服务 而红帽说API应该是重点 微服务可以在 自己的程序 中运行 并通过 轻量级设备与HTTP型API进行沟通 关键在于该服务可以在
  • 高并发模拟~多个线程同时发起请求

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

    高并发 几乎是每个程序员都想拥有的经验 原因很简单 随着流量变大 会遇到各种各样的技术问题 比如接口响应超时 CPU load升高 GC频繁 死锁 大数据量存储等等 这些问题能推动我们在技术深度上不断精进 在过往的面试中 如果候选人做过高并
  • 分布式系统---幂等性设计

    分布式系统 幂等性设计 WEB资源或API方法的幂等性是指一次和多次请求某一个资源应该具有同样的副作用 幂等性是系统的接口对外一种承诺 而不是实现 承诺只要调用接口成功 外部多次调用对系统的影响是一致的 幂等性是分布式系统设计中的一个重要概
  • Java高并发处理方案

    java高并发 如何解决 什么方式解决 一 什么是高并发 二 高并发解决思路 三 高并发解决方案 一 什么是高并发 1 1 高并发 High Concurrency 是互联网分布式系统架构设计中必须考虑的因素之一 它通常是指 通过设计保证系
  • Java 中最快的循环同步是什么(ExecutorService、CyclicBarrier、X)?

    哪种 Java 同步结构可能提供最好的 并发 迭代处理场景的性能 像下面概述的那样固定数量的线程 实验后 我自己呆了一段时间 使用 ExecutorService 和 CyclicBarrier 并且 对结果有些惊讶 我会感激一些 专家建议

随机推荐

  • 指针和引用的区别

    从概念上讲 指针从本质上讲就是存放变量地址的一个变量 在逻辑上是独立的 它可以被改变 包括其所指向的地址的改变和其指向的地址中所存放的数据的改变 而引用是一个别名 它在逻辑上不是独立的 它的存在具有依附性 所以引用必须在一开始就被初始化 而
  • 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