Java并发测试工具类

java代码

package cn.pconline.common.utils;

import java.util.concurrent.CountDownLatch;

import java.util.concurrent.Executors;

import java.util.concurrent.ThreadFactory;

import java.util.concurrent.atomic.AtomicLong;

/**

* 并发测试工具类

* @author jie.zhao

* @date 创建时间:2017年10月17日

* @version v2.0

*/

public class TlUtil {

/**

* 测试耗时

*

* @param nThreads 线程数

* @param task 执行任务

* @param singleNum 单个线程执行个数

* @return

* @throws InterruptedException

*/

public static long timeTasks(int nThreads, int singleNum,

final Runnable task) {

final CountDownLatch startGate = new CountDownLatch(1);

final CountDownLatch endGate = new CountDownLatch(nThreads);

ThreadFactory tf = Executors.defaultThreadFactory();

final int singleExeNum = singleNum == 0 ? 1 : singleNum;

final AtomicLong sum = new AtomicLong();

final AtomicLong min = new AtomicLong(10000);

final AtomicLong max = new AtomicLong(0);

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

tf.newThread(new Thread() {

@Override

public void run() {

try {

startGate.await();

for (int j = 0; j < singleExeNum; j++) {

long start = System.nanoTime();

try {

task.run();

} finally {

long end = System.nanoTime();

long at = ((end - start) / 1000 / 1000);

sum.addAndGet(at);

if (min.get() > at) {

min.getAndSet(at);

}

if (max.get() < at) {

max.getAndSet(at);

}

}

}

endGate.countDown();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}).start();

}

long start = System.nanoTime();

startGate.countDown();

try {

endGate.await();

} catch (InterruptedException e) {

e.printStackTrace();

}

long end = System.nanoTime();

long at = ((end - start) / 1000 / 1000);

int allCount = singleExeNum * nThreads;

System.out.println("执行任务数:" + allCount);

System.out.println("------------------------");

System.out.println("所有线程共耗时:" + transStr(sum.get()));

System.out.println("并发执行完耗时:" + transStr(at));

System.out

.println("单任务平均耗时:" + transStr((double) sum.get() / allCount));

System.out.println("单线程最小耗时:" + transStr(min.get()));

System.out.println("单线程最大耗时:" + transStr(max.get()));

return end - start;

}

public static String transStr(long ms) {

return transStr((double) ms);

}

public static String transStr(double ms) {

if (ms < 1000) {

return ms + " ms";

}

double s = ms / 1000;

if (s < 1000) {

return s + " s";

}

double m = s / 60;

if (m < 60) {

return m + " m";

}

double h = m / 60;

if (h < 24) {

return h + " h";

}

double d = h / 24;

if (d < 30) {

return d + " d";

}

return d + " d";

}

}

java并发测试工具_Java并发测试工具类相关推荐

  1. java并发编程实践_Java并发编程实践如何正确使用Unsafe

    一.前言 Java 并发编程实践中的话: 编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各 ...

  2. java 并发 同步信号_Java并发教程–信号量

    java 并发 同步信号 这是我们将要进行的Java并发系列的第一部分. 具体来说,我们将深入研究Java 1.5及更高版本中内置的并发工具. 我们假设您对同步和易失性关键字有基本的了解. 第一篇文章 ...

  3. java pattern详解_JAVA正则表达式:Pattern类与Matcher类详解

    以下我们就分别来看看这两个类: 一.捕获组的概念 捕获组可以通过从左到右计算其开括号来编号,编号是从1 开始的.例如,在表达式 ((A)(B(C)))中,存在四个这样的组: 1        ((A) ...

  4. java线程饥饿死锁_java并发-线程饥饿死锁测试

    线程饥饿死锁 <Java并发编程实践>中对线程饥饿死锁的解释是这样的:在使用线程池执行任务时,如果任务依赖于其他任务,那么就可能产生死锁问题.在单线程的Executor中,若果一个任务将另 ...

  5. JAVA开发需求分析套路_JAVA并发工具常用设计套路示例代码

    了解JAVA并发工具常用设计套路 前言 在学习JAVA并发工具时,分析JUC下的源码,发现有三个利器:状态.队列.CAS. 状态 一般是state属性,如AQS源码中的状态,是整个工具的核心,一般操作 ...

  6. 用java怎么开发图片标注工具_java 图片处理工具 测试

    使用google 开源工具 对图片进行 压缩 处理 , 这里只测试一下压缩功能 : @RequestMapping(value = "/image/dealImage", meth ...

  7. JAVA线程并发数量控制_Java并发工具类(三):控制并发线程数的Semaphore

    作用 Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源. 简介 Semaphore也是一个线程同步的辅助类,可以维护当前访问自身的线程个数 ...

  8. 用java实现combin函数_Java并发工具类CompletableFuture教程与示例

    Java 8带来了大量的新功能和增强功能,例如Lambda表达式,Streams,CompletableFutures等.在本文中,我将通过简单的示例向您详细说明CompletableFuture及其 ...

  9. java并发编程 目录_Java并发编程实战的作品目录

    展开全部 对本书的赞誉 译者序 前 言 第1章 简介 1.1 并发简史 1.2 线程的优势 1.2.1 发挥多处理器的强大能力e5a48de588b662616964757a686964616f313 ...

  10. java queue 线程安全_java并发编程之线程安全方法

    线程安全的实现方法,包含如下方式 一, 互斥同步 使用互斥锁的方式. 举个栗子 synchronized,最常用的同步实现方案, ReentrantLock,java并发包中工具,后续介绍. 互斥同步 ...

最新文章

  1. xiaohai.cf index.php,php des 加密 - 北京破小孩
  2. 在AWS Lambda上运行脚本语言:PHP、Ruby和Go(外文翻译)
  3. html实现上下三角,css3实现三角形(上下左右)
  4. zabbix 彻底解决图片中文乱码
  5. 牛客网Java刷题知识点之字节缓冲区练习之从A处复制文本文件到B处(BufferedReader、BufferedWriter)、复制文本文件的原理图解...
  6. 使用DOM解析常用方法
  7. SAP Spartacus Page Layout - 页面布局设计
  8. 2.1对 特征归一化 的一些理解
  9. iOS:iOS开发系列–打造自己的“美图秀秀”(中)
  10. 守护线程和非守护线程
  11. LabView2018的安装
  12. easyui获取图片路径_094 ego电商项目-2 菜单、图片上传、CRUD
  13. 关于wordpress主题只显示一个的解决办法
  14. 如何复制网页不让复制的文字
  15. java中文解码_java中文转码解码
  16. js 根据公历日期 算出农历_JS简单获取当前日期和农历日期的方法
  17. win10只能发现部分计算机,Win10的隐藏小秘密,被我发现了
  18. 碧蓝航线经济系统的流程图
  19. 【ChatGPT机器人】打造你的私人聊天助手
  20. Linux安装时分区跳过硬盘锁,安装Linux系统对硬盘分区时,必须有两种分区类型: 和 。...

热门文章

  1. ClientKey实现登录QQ空间,并设置背景音乐
  2. matlab 生成噪声信号
  3. Hello Qt——QtDBus快速入门
  4. matlab伽马分布,伽马分布(Γ分布的分布函数)
  5. 深度卷积神经网络是什么,卷积神经网络结构设计
  6. extmail 发送邮件附件大小限制修改
  7. 蓝海灵豚医疗器械管理隐形眼镜专版用户指南5.9.0.0
  8. 怎么做PPT 课件代做 驼峰设计
  9. div垂直居中的几种方法
  10. freeswitch 改用mysql_freeswitch和Mysql