`

统计多线程下程序运行总时间

    博客分类:
  • java
阅读更多

package com.gpcsoft.hct.epp.egp.thread;

import com.gpcsoft.hct.epp.egp.HttpClientBailApi;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CyclicBarrier;

/**
* @Auther: gaojp
* @Date: 2019/5/5 17:14
* @Description:
*/

public class ThreadTest {

    public static Boolean printStatusInfo = false;
    public void mutiThread(){
        long start = Calendar.getInstance().getTimeInMillis();
        //线程数量
        int num =100;
        Boolean printStatus =false;
        //计数
        CountDownLatch countDownLatch = new CountDownLatch(num);
        //停车栅栏
        CyclicBarrier cyclicBarrier = new CyclicBarrier(num);

        for (int i = 0; i <num ; i++) {
            String mobile ="200"+i;
            String tag =mobile+"_"+ Calendar.getInstance().getTimeInMillis();
            new Thread(new ThreadNum(countDownLatch, mobile,tag,cyclicBarrier,start,printStatus)).start();
            countDownLatch.countDown();

        }
    }


    private class ThreadNum implements Runnable {
        private CountDownLatch countDownLatch;
        private CyclicBarrier cyclicBarrier;
        private long start;
        private boolean printStatus;

        private String mobile;
        private String tag;

        private ThreadNum(CountDownLatch countDownLatch, String mobile, String tag) {
            this.countDownLatch = countDownLatch;
            this.mobile = mobile;
            this.tag = tag;
        }

        private ThreadNum(CountDownLatch countDownLatch, String mobile, String tag,CyclicBarrier cyclicBarrier) {
            this.countDownLatch = countDownLatch;
            this.mobile = mobile;
            this.tag = tag;
            this.cyclicBarrier =cyclicBarrier;
        }


        private ThreadNum(CountDownLatch countDownLatch, String mobile, String tag,
                          CyclicBarrier cyclicBarrier,boolean printStatus) {
            this.countDownLatch = countDownLatch;
            this.mobile = mobile;
            this.tag = tag;
            this.cyclicBarrier =cyclicBarrier;
            this.printStatus = printStatus;
        }

        private ThreadNum(CountDownLatch countDownLatch, String mobile, String tag,
                          CyclicBarrier cyclicBarrier,long start,boolean printStatus) {
            this.countDownLatch = countDownLatch;
            this.mobile = mobile;
            this.tag = tag;
            this.cyclicBarrier =cyclicBarrier;
            this.start = start;
            this.printStatus = printStatus;
        }

        @Override
        public void run() {

            try {
                //等待所有线程准备完毕后,同时访问接口
                countDownLatch.await();
                Map<String,String> req = new HashMap<String,String>();
                req.put("username","little");
                req.put("password","1992");
                Iterator<String> item = req.values().iterator();
                StringBuffer sb = new StringBuffer();
                while (item.hasNext()){
                    sb.append(item.next());
                }
                System.out.println(sb.toString());
                String url ="http://localhost:9090/shiro/loginUser";
                HttpClientBailApi api = new HttpClientBailApi();
                try {
                    String string = api.postStringApi(url, req);
                    System.out.println("result:::"+string.substring(0,10)+"___"+mobile+"-"+tag);
                }catch (Exception ex){
                    ex.printStackTrace();
                }

                //等待线程运行完成
               int awaitNum = cyclicBarrier.await();
                long end = Calendar.getInstance().getTimeInMillis();
                if(!printStatusInfo) {
                    printStatusInfo = true;
                    System.out.println(awaitNum + "运行时间::" + (end - start));
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        ThreadTest  test = new ThreadTest();
        test.mutiThread();

    }

}




分享到:
评论

相关推荐

    用c#写的多线程PING的程序

    总的来说,这个“用C#写的多线程`ping`程序”展示了C#在网络编程中的应用,包括多线程技术、`Ping`类的使用、结果统计以及错误处理。这样的程序对于网络管理员和开发者来说是非常有用的工具,能够快速检测网络的连通...

    基于socket多线程图片传输程序

    总的来说,"基于socket多线程图片传输程序"项目展示了网络编程的基本原理和技术,涉及了socket通信、多线程处理以及性能监控,这些都是IT专业人员必备的知识点。理解并掌握这些技术对于开发高效、可靠的网络应用程序...

    java多线程代码行数计数器

    总的来说,这个“java多线程代码行数计数器”利用Java的多线程特性,提高了代码统计的效率,尤其适用于处理大量源代码的情况。尽管存在一些小瑕疵,但其核心功能强大且实用。对于开发者而言,这无疑是一个有助于项目...

    多线程打开TXT

    6. **异步编程**:虽然多线程可以提高程序并行性,但在UI更新方面,推荐使用异步编程模型,如.NET Framework的`async/await`关键字,这样可以在不阻塞主线程的情况下执行IO密集型任务,保持用户界面的流畅响应。...

    java线程例子程序

    在实际运行中,每个线程的睡眠时间和总挂起时间会打印到控制台,同时,主程序会计算出所有线程的总挂起时间,展示多线程环境中的并发行为。 在Java多线程编程中,还需要注意线程安全问题,例如避免数据竞争和死锁。...

    Python3如何使用多线程升程序运行速度

    然而,需要注意的是,在设计多线程程序时也要充分考虑到线程安全性和资源共享问题,合理使用锁机制来避免数据不一致的问题。此外,随着硬件的发展,未来可能会有更多的处理器核心可用,这将进一步增加多线程技术的...

    统计CPU运行时间的三种方案~!

    在实际开发中,我们可能会结合使用这些方法,比如在多线程或多进程环境下,统计每个线程或进程的CPU时间,然后汇总计算,以了解整个程序的CPU利用率。同时,配合其他性能分析工具,如`top`、`htop`、`perf`等,能更...

    Android多线程实现简单字符串计数器

    2. **AsyncTask**:Android提供的一种轻量级的多线程解决方案,适合短时间、频繁运行的任务。它包含三个泛型参数,分别代表后台执行的输入类型、进度类型和结果类型。通过onPreExecute(), doInBackground(), ...

    并行计算_并行计算_多线程_

    多线程允许程序同时执行多个任务,提高了处理器的利用率,减少了上下文切换的时间开销。 在计算π值的例子中,我们可以使用三种不同的多线程方法: 1. **概率法**:这种方法基于蒙特卡洛模拟,通过随机点落在单位...

    C#打字游戏多线程最新版

    在本项目中,"C#打字游戏多线程最新版"是一个基于C#编程语言开发的打字练习软件,其特色在于利用多线程技术来优化程序性能和用户体验。以下将详细介绍C#语言、打字游戏的实现原理以及多线程在该项目中的应用。 C#是...

    天津大学并行计算 多线程求pi并进行性能分析

    4. 结果展示:给出了不同线程数下的π计算结果,对比单线程和多线程的运行时间。 5. 性能分析:分析了线程增加对计算速度的影响,可能存在线程创建和销毁开销、上下文切换成本等因素的影响。 6. 优化策略:可能探讨...

    详解SE30测试ABAP程序运行效率(多图)

    此时,SE30会展示程序运行的各项统计数据,包括总执行时间、CPU时间、数据库调用次数等。这些数据对于理解程序的性能至关重要。 3. **识别耗时操作**: 在分析结果中,你可以看到程序执行的各个部分按照时间消耗...

    java 多线程

    因此,在设计多线程程序时,应该格外注意异常处理。一种常见的做法是在`run()`方法中添加异常处理代码,或者使用`Thread.setUncaughtExceptionHandler()`方法来设置默认的异常处理器。 #### 五、字符流的应用 字符...

    5操作系统实验报告.doc

    实验结果显示,当子线程睡眠时间较短时,多线程程序的总执行时间可能短于单线程。这是因为多线程可以并发执行任务,减少了等待时间。而单线程程序的执行时间受其内部逻辑控制,如睡眠时间。 通过这个实验,我们可以...

    Java实现的耗时统计类-可用于测试程序耗时

    在Java编程中,有时我们需要对程序的运行时间进行度量,以便分析性能瓶颈或优化代码。这个"Java实现的耗时统计类"就是为了满足这样的需求而设计的。它可以帮助开发者在执行特定操作前后记录时间,然后计算并输出操作...

    vc++获取系统时间和程序运行时间宣贯.pdf

    3. **clock_t clock()**:它返回程序运行至今CPU使用的总时间,单位是`CLOCKS_PER_SEC`,即每秒的时钟周期数。精度取决于系统定义的CLOCKS_PER_SEC。 4. **DWORD GetTickCount()**:获取系统启动后经过的毫秒数,...

    哈工大软件学院操作系统实验3_进程运行轨迹的跟踪与统计

    例如,`fork()`函数用于创建新进程,`waitpid()`用于等待子进程结束,`execve()`用于替换当前进程的执行映像,以及`pthread_create()`和`pthread_join()`对于多线程环境下的线程管理。 在实验中,学生可能需要编写...

    代码行统计工具,可以显示统计代码进度条

    进度条是一种可视化控件,它允许用户看到后台任务的执行进度,增加了用户对程序运行状态的感知。在统计大量代码时,这尤其重要,因为它可以让用户知道任务何时完成,避免因长时间无反馈而产生的疑惑。进度条的实现...

    sqlite3-stress:多线程写入Sqlite3数据库

    总的来说,“sqlite3-stress”是评估和优化SQLite3数据库在多线程写入场景下性能的重要工具,它帮助开发者确保在并发压力下,数据库系统依然能够稳定、高效地运行。通过深入理解和使用这个工具,开发者可以更好地...

    Python内存泄漏和内存溢出的解决方案

    Python内存管理是一个重要的主题,尤其是对于那些运行长时间后台服务的开发者而言。虽然Python有内置的垃圾回收机制,但仍然可能出现内存泄漏和内存溢出的问题,影响程序的稳定性和效率。 **一、Python内存泄漏** ...

Global site tag (gtag.js) - Google Analytics