java 并发测试main方法_Java并发测试

要求:模拟200个设备,尽量瞬间并发量达到200。

思路

第一种:线程池模拟200个线程——wait等待线程数达200——notifyAll唤醒所有线程

第二种:线程池模拟200个线程——阻塞线程——达到200条件释放

比较

两种方案都可以实现瞬时高并发的模拟,但是建议使用第二种方案。

第一种方案中,压测过程中,wait状态下的线程已经释放对象上的锁定,唤醒时会极大的消耗CPU资源。压测程序可能直接导致机器崩溃

第二种方案,由于阻塞过程中,线程不会释放掉目前持有的对象资源,因此等待条件释放不会造成资源的过度消耗。

但是应当选择好阻塞方式,避免线程操作时的死锁。同时实现线程之间的通信。

wait-notifyAll

代码较简单,通过线程池启动1000个线程,通过synchronized保证线程可见性,和安全性。

当线程数量未达到1000时,wait使线程退出CPU,释放锁。

当线程数量达到1000时,notifyAll通知等待集上的线程,唤醒线程。

代码如下:

/**

* @author:     irvingyuan

* @since       2017年1月22日 下午4:51:51

* @version:

*/

public class Parallellimit {

public static void main(String[] args) {

ExecutorService pool = Executors.newCachedThreadPool();

Counts count = new Counts();  //共享操作该计数变量,不能使用int或者integer,Java无法对非对象、和包装类进行加锁wait

count.num = 0;

for(int i=0;i<10000;i++){     //启动线程

MyRunnable runnable = new MyRunnable(count);

pool.execute(runnable);

}

pool.shutdown();     //关闭线程池,无法加入新线程任务,但不影响现有线程

}

}

public class MyRunnable implements Runnable{

private Counts count ;

/**

* 通过构造方法传入初值,避免set和get时线程的不安全性

*/

public MyRunnable(Counts count){

this.count = count;

}

public void run() {

try {

/**

* 加锁,保证线程可见性和安全性

*/

synchronized (count) {

count.num++;

if(count.num<10000){

System.out.println(count.num);

count.wait();//一定要调用count对象的wait,默认对this,无法持有线程的锁,抛出异常

}

/**

* 达到10000时唤醒所有线程

*/

if(count.num == 10000){

count.notifyAll();

}

System.out.println("并发量 count="+count.num);

}

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

测试结果

并发唤醒1000个线程时,CPU瞬时使用率瞬时增长17%左右。可见CPU负担很大。

继续增大线程数,JVM抛OOM异常退出,需要修改启动参数

block阻塞方式

同步代码块持有count的锁,保证创建出正确的线程数量。判断不够并发量时,使用while阻塞线程。

当达到并发量时,阻塞条件失效,线程继续运行。

代码如下:

/**

* 阻塞方式创建瞬时高并发

* @author:     irvingyuan

* @since       2017年1月23日 下午4:45:56

* @version:

*/

public class BlockRunnable implements Runnable{

private Counts count ;

/**

* 通过构造方法传入初值,避免set和get时线程的不安全性

*/

public BlockRunnable(Counts count){

this.count = count;

}

public void run() {

/**

* this肯定失效,this调用处为runnable对象

* 此时加锁表示多个线程只能有一个线程在某时刻操作该runnable

* new出来了n个线程,自己调用自己的,this必定失效

* synchronized (this) {

*/

synchronized (count) {

count.num++;

System.out.println("Thread count = "+count.num);

}

/**

* 注意synchronized的粒度

* while放在代码快中会导致线程一直持有锁等待,下一个线程无法生成和进行

*/

while(count.num<100);

//并发操作

System.out.println("concurrency count = "+count.num);

}

}

测试效果

100个线程瞬时的CPU使用率居然激增到了100%,和资料说的完全想法,更加损耗系统资源。(是不是因为while?)

//原文使用sleep,个人认为时间不好掌握,用while直接长时间做条件阻塞

CountDownLatch

Java提供的实现阻塞和释放线程的类,尝试是否符合推荐的规律。

其中主要包含三个方法

countDownLatch(100)     类通过构造方法传入计数数量。

countDown()     方法会减少一个计数值

await()     方法自动阻塞线程,直到count的值变为0

执行过程中,同步操作count后,开始等待,直到100个线程全部创建后并发执行

代码如下

public class Parallellimit {

public static void main(String[] args) {

ExecutorService pool = Executors.newCachedThreadPool();

Counts count = new Counts();

count.num = 0;

CountDownLatch cdl = new CountDownLatch(100);

for(int i=0;i<100;i++){

CountRunnable runnable = new CountRunnable(cdl);

pool.execute(runnable);

}

}

}

/**

* 〈countDownlatch实现高并发〉

* @author:     irvingyuan

* @since       2017年1月23日 下午5:45:59

* @version:

*/

public class CountRunnable implements Runnable {

private CountDownLatch countDownLatch;

public CountRunnable(CountDownLatch countDownLatch){

this.countDownLatch = countDownLatch;

}

public void run() {

try {

/**

* 不加锁也可以支持,虽然打印出的值不对,但最后计算次数却是100次

* 说明确实是执行了整整100次才并发,计算次数正确

*/

synchronized (countDownLatch) {

/**

* 每次减少一个容量

*/

countDownLatch.countDown();

System.out.println("thread counts = "+(countDownLatch.getCount()));

}

/**

* 阻塞线程,直到countDown至0

*/

countDownLatch.await();

System.out.println("concurrency counts = "+(100-countDownLatch.getCount()));

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

测试结果

CPU增长率大约10%左右,相对于wait-notify方式要减少约一半。

综上,阻塞似乎是最坑爹的一种方式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/505214.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pajek软件使用方法_使用Jco远程连接SAP软件系统方法

作者&#xff1a;JongWill声明&#xff1a;本文章仅用于SAP软件的应用与学习&#xff0c;不代表SAP公司。(注&#xff1a;文中所示截图来源SAP软件&#xff0c;相应著作权归SAP所有。)SAP公司的ERP系统是一套成熟的套装软件&#xff0c;它是博大精深的&#xff0c;但也不是无所…

linux mysql 安装innodb_在ubuntu Mysql 5.7 安装InnoDB Memcached 插件

在ubuntu Mysql 5.7 安装Memcached 插件参考&#xff1a;https://dev.mysql.com/doc/refman/5.7/en/innodb-memcached-setup.htmlMySQL 5.7 Reference Manual / The InnoDB Storage Engine / InnoDB memcached Plugin15.20 InnoDB memcached Plugin15.20.1 Benefits of the Inn…

python怎么定义正方形函数_python – Matplotlib自定义图例以显示正方形而不是矩形...

这是我尝试将条形图的图例从矩形更改为方形&#xff1a;import matplotlib.patches as patchesrect1 patches.Rectangle((0,0),1,1,facecolor#FF605E)rect2 patches.Rectangle((0,0),1,1,facecolor#64B2DF)plt.legend((rect1, rect2), (2016, 2015))但是当我绘制这个时,我仍然…

java 排列3_java中的三大排序算法

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。本文链接&#xff1a;https://blog.csdn.net/pqwGreenhand/article/details/53581577一、冒泡排序已知一组无序数据a[1]、a[2]、……a[n]&#xff…

python 批量查询网页导出结果_python批量查询网页的HTTP状态码

最近业余时间在改版一个网站&#xff0c;改版之前频繁调整了一些栏目的属性&#xff0c;包括栏目的层级&#xff0c;这种最怕就是调整了栏目的从属关系&#xff0c;导致了栏目的URL地址改变&#xff0c;一旦改版就导致整个栏目及其下面的文章页地址变更&#xff0c;成为死链。而…

java 文件夹存在文件_Java判断是否存在文件和文件夹

获取项目绝对路径&#xff1a;this.getClass().getClassLoader().getResource(".").getPath()1、判断文件是否存在&#xff0c;不存在创建文件File filenew File("C:\\Users\\QPING\\Desktop\\JavaScript\\2.htm");if(!file.exists()){try {file.createNew…

镜像浏览器_害怕win10镜像有第三方软件,直接到微软官网下载,原汁原味

很多时候我们在网上下载的一些win10镜像ISO文件都包含有一些第三方的软件&#xff0c;虽然这都是网站为了盈利而不得不做的&#xff0c;但是辛苦下载安装好的windows系统&#xff0c;如果有乱七八糟的软件心里真的会非常不舒服&#xff0c;甚至以前电脑城的win7所谓正版光碟都是…

post大小限制_作为一个程序员,面试中常问的get和post的区别,你真的知道吗

作为一个程序员无论是搞前端的还是搞后端的&#xff0c;只要问起来GET和POST的区别&#xff0c;都能说出来个一二三四来。你可能自己写过无数个GET和POST请求&#xff0c;或者也看过很多权威网站总结出来的区别&#xff0c;你非常清楚的知道什么时候用GET什么时候用POST.当你在…

java static 修饰变量吗_Java面试 - static 修饰的变量和方法有哪些特点?

1、static修饰的变量和方法&#xff0c;在类加载时即被初始化&#xff0c;可直接通过类名.变量名和类型.方法名进行调用。2、static修饰的变量&#xff0c;在类加载时会被分配到数据区的方法区。类的实例可共享方法区中的变量。如果static修饰的变量发生改变&#xff0c;那么所…

安卓手机如何防盗_如何设置安卓手机各版本USB调试模式

关注我们&#xff0c;获得更多资讯在这篇教学中&#xff0c;小蛙会详细向大家讲解USB调试模式的开启及关闭方法&#xff0c;以及其用途。在这个过程中&#xff0c;由于Android 机型众多&#xff0c;所以无办法列举太多。但请相信小蛙&#xff0c;开启USB 调试的操作方法基本上是…

python类的私有属性_Python类的私有属性

在 C 和 Java 中&#xff0c;属性(成员)有访问控制&#xff0c;如 public 表示任意代码可以访问该属性&#xff0c;private 表示仅当前类的代码才可以访问该属性。Python 中没有这个访问控制符&#xff0c;但是可以在属性前面加上 __ 两个下划线来表示该属性不能在类外部访问。…

java boolean if_Java if(boolean)和if(boolean=true)区别解析

这篇文章主要介绍了Java if(boolean)和if(booleantrue)区别解析,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下我们都知道if(){}条件的括号中放的是布尔值&#xff0c;但是现在有两种情况&#xff0c;都是放布尔…

iphone同步助手_iPhone 与安卓手机之间如何进行资料迁移

​上一期我们介绍了 iPhone 之间和安卓手机之间如何备份和进行资料迁移&#xff0c;很多朋友都留言说想知道 iPhone 与安卓手机之间如何进行资料迁移&#xff0c;看来双十一大家都剁手换了手机啊&#xff0c;嘴上说着不要&#xff0c;到头来还是管不住自己的手。同操作系统的手…

当前记录集不支持更新_不断中招的你还放心升级win10吗?wi10近期更新问题及解决办法...

.专于心 精于形.Win10用户升级5月更新后屏幕出现蓝绿伪影&#xff1a;或跟调节色温软件有关随着五月更新升级范围的扩大&#xff0c;一些问题也是加速展现在微软面前。现在&#xff0c;有不少Windows 10用户反馈称&#xff0c;自己升级至五月更新后&#xff0c;屏幕出现了蓝绿伪…

k8s管理java项目_Kubernetes集群部署项目-部署Java项目(推送镜像

Kubernetes(简称k8s)是谷歌开源的一套容器化集群管理系统&#xff0c;当下已被众多大厂及中小企业采用&#xff0c;容器化技术是目前的大势所趋。本套教程k8s版本升级为最新版1.18.0&#xff0c;内容由浅入深&#xff0c;且更加深化细节&#xff0c;对于Java开发者大大提高友好…

易班自动答题脚本_如何使用python进行自动网上考试

前言文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。作者&#xff1a; HIS HackerPS&#xff1a;如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http://t.cn/A6Zvjdun背景说明在github上发现一…

两个子集pom互相调用_声明式服务调用组件Feign

什么是Feign&#xff1f; Feign是SpringCloud组件中的一个轻量级RESTful的HTTP服务客户端。Feign内置了Ribbon&#xff0c;用来做客户端负载均衡&#xff0c;去调用服务注册中心的服务。什么是OpenFeign&#xff1f;OpenFeign是SpringCloud在Feign的基础上支持了SpringMVC的…

安卓手机主题软件_安卓手机安装不了软件原因和方法

安卓手机不能安装软件其实有很多的原因&#xff0c;排除可以避免的原因(google授权)&#xff0c;其他的硬件设施的支持&#xff0c;也可能出现软件不能安装的现象。有的是可以解决的&#xff0c;但有的是强制性原因&#xff0c;那就没有办法了。下面就来分析下软件不能安装的几…

java jbutton 不显示_java – JButton中的图像未显示

有人可以看看这段代码并告诉我我做错了什么&#xff1f;根本没有显示图像.它们在同一个包装中.谢谢public class MWindow31Pic extends JFrame implements ActionListener{private JPanel contPane (JPanel) this.getContentPane();private JButton button new JButton(new I…

python类的mod_apache+mod_python

一.安装apache(httpd-2.2.25.tar.gz )到 http://httpd.apache.org 下载最新的apache源码&#xff0c;解压后进入目录&#xff1a;我想把apache安装到/usr/lcoal/apache下&#xff0c;所以执行如下命令执行&#xff1a;./configure --prefix/usr/lcoal/apache --enable-track-va…