java并发测试工具_Java并发测试工具类
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并发测试工具类相关推荐
- java并发编程实践_Java并发编程实践如何正确使用Unsafe
一.前言 Java 并发编程实践中的话: 编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各 ...
- java 并发 同步信号_Java并发教程–信号量
java 并发 同步信号 这是我们将要进行的Java并发系列的第一部分. 具体来说,我们将深入研究Java 1.5及更高版本中内置的并发工具. 我们假设您对同步和易失性关键字有基本的了解. 第一篇文章 ...
- java pattern详解_JAVA正则表达式:Pattern类与Matcher类详解
以下我们就分别来看看这两个类: 一.捕获组的概念 捕获组可以通过从左到右计算其开括号来编号,编号是从1 开始的.例如,在表达式 ((A)(B(C)))中,存在四个这样的组: 1 ((A) ...
- java线程饥饿死锁_java并发-线程饥饿死锁测试
线程饥饿死锁 <Java并发编程实践>中对线程饥饿死锁的解释是这样的:在使用线程池执行任务时,如果任务依赖于其他任务,那么就可能产生死锁问题.在单线程的Executor中,若果一个任务将另 ...
- JAVA开发需求分析套路_JAVA并发工具常用设计套路示例代码
了解JAVA并发工具常用设计套路 前言 在学习JAVA并发工具时,分析JUC下的源码,发现有三个利器:状态.队列.CAS. 状态 一般是state属性,如AQS源码中的状态,是整个工具的核心,一般操作 ...
- 用java怎么开发图片标注工具_java 图片处理工具 测试
使用google 开源工具 对图片进行 压缩 处理 , 这里只测试一下压缩功能 : @RequestMapping(value = "/image/dealImage", meth ...
- JAVA线程并发数量控制_Java并发工具类(三):控制并发线程数的Semaphore
作用 Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源. 简介 Semaphore也是一个线程同步的辅助类,可以维护当前访问自身的线程个数 ...
- 用java实现combin函数_Java并发工具类CompletableFuture教程与示例
Java 8带来了大量的新功能和增强功能,例如Lambda表达式,Streams,CompletableFutures等.在本文中,我将通过简单的示例向您详细说明CompletableFuture及其 ...
- java并发编程 目录_Java并发编程实战的作品目录
展开全部 对本书的赞誉 译者序 前 言 第1章 简介 1.1 并发简史 1.2 线程的优势 1.2.1 发挥多处理器的强大能力e5a48de588b662616964757a686964616f313 ...
- java queue 线程安全_java并发编程之线程安全方法
线程安全的实现方法,包含如下方式 一, 互斥同步 使用互斥锁的方式. 举个栗子 synchronized,最常用的同步实现方案, ReentrantLock,java并发包中工具,后续介绍. 互斥同步 ...
最新文章
- xiaohai.cf index.php,php des 加密 - 北京破小孩
- 在AWS Lambda上运行脚本语言:PHP、Ruby和Go(外文翻译)
- html实现上下三角,css3实现三角形(上下左右)
- zabbix 彻底解决图片中文乱码
- 牛客网Java刷题知识点之字节缓冲区练习之从A处复制文本文件到B处(BufferedReader、BufferedWriter)、复制文本文件的原理图解...
- 使用DOM解析常用方法
- SAP Spartacus Page Layout - 页面布局设计
- 2.1对 特征归一化 的一些理解
- iOS:iOS开发系列–打造自己的“美图秀秀”(中)
- 守护线程和非守护线程
- LabView2018的安装
- easyui获取图片路径_094 ego电商项目-2 菜单、图片上传、CRUD
- 关于wordpress主题只显示一个的解决办法
- 如何复制网页不让复制的文字
- java中文解码_java中文转码解码
- js 根据公历日期 算出农历_JS简单获取当前日期和农历日期的方法
- win10只能发现部分计算机,Win10的隐藏小秘密,被我发现了
- 碧蓝航线经济系统的流程图
- 【ChatGPT机器人】打造你的私人聊天助手
- Linux安装时分区跳过硬盘锁,安装Linux系统对硬盘分区时,必须有两种分区类型: 和 。...