Java tps_Java static

Java tps_Java static写在前面TPS即每秒查询事物,可以用于测试一个方法、工具或者系统的性能。本文采用Java并发包中的工具实现了一个工具TPS性能测试。主要是测试OKHttp库来执行Http请求的性能。测试代码用到了Java了线程池ExecuterService,CountDownLatch,CyclicBarrier,原子类,volatile关键词等。可算是对Java并发组件的组合使用。下面直接贴出源码,仅供参考

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

写在前面

TPS即每秒查询事物,可以用于测试一个方法、工具或者系统的性能。本文采用Java并发包中的工具实现了一个工具TPS性能测试。主要是测试OKHttp库来执行Http请求的性能。测试代码用到了Java了线程池ExecuterServiceCountDownLatch, CyclicBarrier, 原子类,volatile关键词等。可算是对Java并发组件的组合使用。下面直接贴出源码,仅供参考,如有错误,欢迎指出,以期共同探讨。

TPS 实现源码

package cn.concurrent;

import java.math.RoundingMode;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;

import util.OkHttpUtil;

import com.google.common.math.LongMath;

/** * 每秒事物执行次数统计 * * @author Xie le * @date 2016/7/9 */
public class TpsWorkbeanch { 
   

    /** 线程数量 */
    public static final int N_THRESHOLDS = 5;

    /** 30 秒总时间 */
    public static final int TIME_THRESHOLDS = 30;

    /** 用原子变量来统计执行时间,便于作原子递减 */
    private static AtomicInteger totalTime = new AtomicInteger(TIME_THRESHOLDS);

    /** 用于统计执行的事物总数,用原子方式累加记录 */
    private static AtomicLong totalExecCount = new AtomicLong(0L);

    /** 需要到等到所有线程都在同一起跑线,才开始统计计数,类似于发令枪 */
    private static CyclicBarrier barrier = new CyclicBarrier(N_THRESHOLDS);

    /** 执行时间到达时,所有的线程需要依次退出,主线程才开始统计执行事物总数 */
    private static CountDownLatch countDownLatch = new CountDownLatch(N_THRESHOLDS);

    /** 线程执行标记 , 用volatile修饰,使变量修改具有线程可见性 */
    private static volatile boolean runnning = true;

    /** 用线程池来执行统计 */
    private static ExecutorService executorService;

    /** * 用接口来作模拟统计 */
    interface Job {
        void execute() throws Exception;
    }

    /** * 具体Job,模拟完成一次Http请求 BTW:内部类用static修饰 */
    static class JobDetail implements Job {

        public void execute() throws Exception {
            String run = OkHttpUtil.run("http://publicobject.com/helloworld.txt");
        }
    }

    /** * Worker执行Job */
    static class Worker implements Runnable {

        private Job job;

        Worker(Job job) {
            this.job = job;
        }

        // 每个线程执行的事物统计量
        int innerCount = 0;

        public void run() {
            try {
                barrier.await(); // 等到所有线程都在起跑线
                while (runnning) {
                    this.job.execute();
                    innerCount++;
                }
            } catch (Exception e) {
                System.out.println("线程Id:" + Thread.currentThread().getId() + " " + e.getMessage());
            } finally {
                // 累加到总记录统计量
                System.out.println("线程Id:" + Thread.currentThread().getId() + " 执行事物次数为:" + innerCount);
                totalExecCount.getAndAdd(innerCount);
                // 线程结束后,依次计数, 便于主线程继续执行
                countDownLatch.countDown();
            }
        }
    }

    public static void run() throws Exception {
        Job job = new JobDetail(); // 创建Job
        executorService = Executors.newFixedThreadPool(N_THRESHOLDS); // 新建固定大小线程的池子
        for (int i = 0; i < N_THRESHOLDS; i++) {
            executorService.submit(new Worker(job)); // 提交线程到池子中
        }
        // 还需要一个线程,用于周期检查执行时间是否到达
        final ScheduledExecutorService scheduledExcutor = Executors.newSingleThreadScheduledExecutor();
        scheduledExcutor.scheduleAtFixedRate(new Runnable() {
            public void run() {
                if (totalTime.decrementAndGet() == 0) { // 执行时间递减到0
                    runnning = false; // 告诉线程,时间到了,所有线程不再执行
                    scheduledExcutor.shutdownNow();
                }
            }
        }, 1L, 1L, TimeUnit.SECONDS);

        // 主线程等到所有的线程都退出,则开始统计
        countDownLatch.await();

        long totalExeCount = totalExecCount.get();
        System.out.println(N_THRESHOLDS + " 个线程," + TIME_THRESHOLDS + " 秒内总共执行的事物数量:" + totalExeCount);

        long tps = LongMath.divide(totalExeCount, TIME_THRESHOLDS, RoundingMode.HALF_EVEN);

        System.out.println("OKHttp执行的TPS: " + tps);

        executorService.shutdownNow(); // 关闭线程池


    }

    public static void main(String[] args) throws Exception {

        run();
    }

}

其中用到的OKHttp类如下:

package util;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

/** * OkHttp工具 * @author Xie le * @date 2016/6/30 */
public class OkHttpUtil { 
   

    private static OkHttpClient okHttpclient = null;

    static {
        okHttpclient = new OkHttpClient.Builder()
                .connectTimeout(3, TimeUnit.SECONDS)
                .build();
    }

    public static String run(String url) throws Exception {
        Request request = new Request.Builder().url(url).build();
        Response response = okHttpclient.newCall(request).execute();
        if (!response.isSuccessful()) {
            throw new IOException("Unexpected code " + response);
        }
        return response.body().string();

    }
}

测试结果

测试结果与环境有关。以我本机为例,5个线程,30秒内的测试结果如下:

线程Id:14 connect timed out
线程Id:14 执行事物次数为:0
线程Id:10 connect timed out
线程Id:10 执行事物次数为:0
线程Id:11 执行事物次数为:29
线程Id:13 执行事物次数为:33
线程Id:12 执行事物次数为:26
5 个线程,30 秒内总共执行的事物数量:88
OKHttp执行的TPS: 3

最后

直接阅读代码,可以掌握Java并发的常用的工具类。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/194201.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python正则表达式或者用法_python正则表达式使用实例

    python正则表达式或者用法_python正则表达式使用实例搞懂Python正则表达式用法作者:枫叶云来源:见文末Python正则表达式正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。Python自1.5版本起增加了re模块,它提供Perl风格的正则表达式模式。re模块使Python语言拥有全部的正则表达式功能。compile函数根据一个模式字符串和可选的标志参数生成一个正…

    2022年9月26日
    2
  • linux中nmap命令,Linux中nmap命令起什么作用呢?

    linux中nmap命令,Linux中nmap命令起什么作用呢?摘要:下文讲述Linux中nmap的功能说明,如下所示;nmap是一个网络探测和安全审核的工具,它目前是开放源代码模式nmap命令功能:用于网络探测工具和安全和端口扫描器它可以快速扫描大型网络它运用原始的ip报文的方式发现网络上的主机nmap命令的语法格式:nmap[参数]—–常用参数说明——–traceroute:扫描主机端口并跟踪路由-p:扫描指定端口和端口范围-sP:对目标…

    2022年5月28日
    42
  • 用js来实现那些数据结构14(树02-AVL树)

    在使用二叉搜索树的时候会出现一个问题,就是树的一条分支会有很多层,而其他的分支却只有几层,就像下面这样:如果数据量够大,那么我们在某条边上进行增删改查的操作时,就会消耗大量的时间。我们花费精力去构

    2022年3月25日
    31
  • 新建一个vue项目[通俗易懂]

    新建一个vue项目[通俗易懂]1.npm install -g vue-cli2.vue init webpack demo1demo1自定义项目名称创建成功后可以在目录下看到文件夹3.static文件夹用于存放一些静态资源,如图片图标等4. 组件存放在src/components文件夹中5.配置路由 ①package.json里查看”dependencies”是否有:”vue-router”: “^3.0.1″,没有就加上去 ②”src”目录下main.js是否引入路由,没有就加上 …

    2022年8月18日
    6
  • java构造函数方法声明无效_如何构造函数

    java构造函数方法声明无效_如何构造函数一、什么是构造函数java构造函数,也叫构造方法,是java中一种特殊的函数。函数名与相同,无返回值。作用:一般用来初始化成员属性和成员方法的,即new对象产生后,就调用了对象了属性和方法。在现实生活中,很多事物一出现,就天生具有某些属性和行为。比如人一出生,就有年龄、身高、体重、就会哭;汽车一出产,就有颜色、有外观、可以运行等。这些,我们就可以将这些天然的属性和行为定义在构造函数中,…

    2025年10月9日
    2
  • app弱网测试的方法(测试自己声音类型app)

    一,弱网场景简介当前APP网络环境比较复杂,网络制式有2G、3G、4G网络,还有越来越多的公共Wi-Fi。不同的网络环境和网络制式的差异,都会对用户使用app造成一定影响。另外,骑士使用我们产品的场景多变,如进入地下美食城、进电梯,进各种写字楼,居民楼等,使得弱网测试显得尤为重要。如果app没有对各种网络异常进行兼容处理,那么骑士在进行正常的业务履单操作时可能遇到APP闪退、ANR、数据丢失等问题。二,弱网测试介绍什么样的网络属于弱网?低于2G速率的时候都属于弱网,3G也可划分为弱网,一般Wi-

    2022年4月17日
    91

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号