用栅栏(CyclicBarrier)实现高并发测试

CyclicBarrier

含义

栅栏允许两个或者多个线程在某个集合点同步。当一个线程到达集合点时,它将调用await()方法等待其它的线程。线程调用await()方法后,CyclicBarrier将阻塞这个线程并将它置入休眠状态等待其它线程的到来。等最后一个线程调用await()方法时,CyclicBarrier将唤醒所有等待的线程然后这些线程将继续执行。CyclicBarrier可以传入另一个Runnable对象作为初始化参数。当所有的线程都到达集合点后,CyclicBarrier类将Runnable对象作为线程执行。

方法

await():使线程置入休眠直到最后一个线程的到来之后唤醒所有休眠的线程

代码实现

原理:设置赛马集合点(线程启动需要一些时间),然后一起赛跑

package org.java;

import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.junit.Test;

public class TestCyclic {
@Test
public void test01() {
int count = 10;//并发线程数
CyclicBarrier cyclicBarrier = new CyclicBarrier(count);
ExecutorService executorService = Executors.newFixedThreadPool(count);
int n = 0;
for (int i = 0; i < count; i++) {

executorService.execute(new TestCyclic().new Task(cyclicBarrier, n));
n++;
}
executorService.shutdown(); // 关闭线程池
// 判断是否所有的线程已经运行完
while (!executorService.isTerminated()) {
try {
// 所有线程池中的线程执行完毕,执行后续操作
// TODO
System.out.println(“==============is sleep============”);
Thread.sleep(10000);
System.out.println(“==============is wake============”);

} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

public class Task implements Runnable {
private CyclicBarrier cyclicBarrier;
int n = 0;

public Task(CyclicBarrier cyclicBarrier, int n) {
this.cyclicBarrier = cyclicBarrier;
this.n = n;
}

@Override
public void run() {
try {
// 等待所有任务准备就绪
System.out.println(“赛马” + n + “到达栅栏前”);
cyclicBarrier.await();
System.out.println(“赛马” + n + “开始跑”);
// 测试内容
System.out.println(“hello: ” + n);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

运行代码结果如下:

==============is sleep============
赛马0到达栅栏前
赛马1到达栅栏前
赛马3到达栅栏前
赛马2到达栅栏前
赛马4到达栅栏前
赛马5到达栅栏前
赛马7到达栅栏前
赛马6到达栅栏前
赛马8到达栅栏前
赛马9到达栅栏前
赛马9开始跑
赛马8开始跑
hello: 8
赛马6开始跑
hello: 6
赛马7开始跑
hello: 7
赛马0开始跑
hello: 0
赛马5开始跑
hello: 5
赛马4开始跑
hello: 4
赛马2开始跑
hello: 2
赛马3开始跑
hello: 3
赛马1开始跑
hello: 1
hello: 9
==============is wake============


原文地址:http://blog.51cto.com/8132260/2139649

时间: 2024-11-10 07:55:21

用栅栏(CyclicBarrier)实现高并发测试的相关文章

多线程访问网页+高并发测试网站

多线程访问网页+高并发测试网页 仅供学习,请勿用于非法用途. 线程类如下 import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; public class TestThread extends Thread{ private String httpurl

Jmeter之仿真高并发测试(集合点)

场景: 大家在使用Jmeter测试的时候应该发现了, (1)线程启动了就会直接发送测试请求:--如果要模拟在一瞬间高并发量测试的时候,需要调高线程数量,这很耗测试机器的性能,往往无法支持较大的并发数,无法控制每次测试的瞬间并发量: (2)如果使用了constant throughput timer,可以模拟较长时间的并发测试,但是仍无法满足稳定的瞬间高并发测试: 解决: 1.使用集合点: 作用:阻塞线程,直到指定的线程数量到达后,再一起释放,可以瞬间产生很大的压力. 引用虫师的话"红军排长说:等

java高并发测试代码

package com.example.test; import java.net.URL;import java.net.URLConnection;import java.util.concurrent.CountDownLatch; /** * Created with IDEA * author:QinWei * Date:2018/12/27 * Time:11:08 * 并发测试 */public class ConnectTest { public static void main

性能测试_webbench高并发测试工具

1.简介 webbench最多可以模拟3万个并发连接去测试服务器的负载能力,编译和配置简单,仅基于TCP协议上对服务器进行测试.Webbench也是开放源码,从代码上看,每个客户端都fork出一个进程进行测试,仅在TCP协议层对服务器测试,并未涉及HTTP协议. 2.安装 源码下载: http://blog.s135.com/soft/linux/webbench/webbench-1.5.tar.gztar zxvf webbench-1.5.tar.gzcd webbench-1.5make

高并发测试工具webbench

1.简介 webbench最多可以模拟3万个并发连接去测试服务器的负载能力,编译和配置简单,仅基于TCP协议上对服务器进行测试.Webbench也是开放源码,从代码上看,每个客户端都fork出一个进程进行测试,仅在TCP协议层对服务器测试,并未涉及HTTP协议. 2.安装 源码下载: http://blog.s135.com/soft/linux/webbench/webbench-1.5.tar.gz tar zxvf webbench-1.5.tar.gz cd webbench-1.5 m

jedispool 连 redis 高并发卡死

java端在使用jedispool 连接redis的时候,在高并发的时候经常卡死,或报连接异常,JedisConnectionException,或者getResource 异常等各种问题 在使用jedispool 的时候一定要注意两点 1. 在获取 jedisPool和jedis的时候加上线程同步,保证不要创建过多的jedispool 和 jedis 2. 用完Jedis实例后需要返还给JedisPool 整理了一下redis工具类,通过大量测试和高并发测试的 package com.casp

epoll高并发多路复用,基于epoll的高性能服务器

并发测试工具ab使用 linux命令安装这个工具:apt-get install apache2 windows中装好apache之后就会再带一个工具 windows命令使用方法 ab -n 200 -c 5 http://www.baidu.com/ 1000就是测试的数量 -c 10 就是开启的线程数 测试的地址 反回了一些测试信息,如 使用时间,每次要多久等信息. linux也是一样用的. epoll多路复用IO 高并发 epoll多路复用是专门用来处理高并发的,在linux多路复用中有多

一个老项目的高并发改造,遇到的redis连接不释放问题。

问题来由 一个老系统使用频率很低,但是一旦用,就是很多人一起用.每次这个时候,服务都会挂掉. 原因是使用mysql数据库做复杂计算.没有使用缓存. 着手解决 框架版本 struts 2.0 spring 3.2 集成redis <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmln

【转】腾讯高级工程师:一道面试题引发的高并发性能调试思考

https://dbaplus.cn/news-21-625-1.html 这样打破沙锅问到底的精神十分可贵!注意其中用到的工具 4月份的时候看到一道面试题,据说是腾讯校招面试官提的:在多线程和高并发环境下,如果有一个平均运行一百万次才出现一次的bug,你如何调试这个bug?(知乎原贴地址如下:https://www.zhihu.com/question/43416744) 遗憾的是知乎很多答案在抨击这道题本身的正确性,虽然我不是这次的面试官,但我认为这是一道非常好的面试题.当然,只是道加分题,