[Java] 统计从创建到结束所有线程消耗的总时间

Java Code

public class CreateThread extends Thread
{
    // define constructors
    public CreateThread() {}

    @Override
    public void run()
    {
        try
        {
       // 每个线程睡眠5秒 Thread.sleep(
5000); } catch (InterruptedException e) { e.printStackTrace(); } } public static void main(String[] args) throws InterruptedException { long begin = System.currentTimeMillis(); for (int i = 0; i < 1000; i++) { Thread thread = new CreateThread(); thread.start(); System.out.println("activeCount : " + Thread.activeCount()); } System.out.println("activeCountMain1 : " + Thread.activeCount());

        // 每一个进程都有一个主线程,Java里面通常都指的是main方法
        // Thread.activeCount() == 1 时只有main线程在运行,其他的都结束或者挂起或者撤销了
        // 把while这段代码注释掉之后再运行一次
        while (true)
        {
            if ( Thread.activeCount() == 1 ) break;
        }
System.out.println(
"activeCountMain2 : " + Thread.activeCount()); long end = System.currentTimeMillis(); System.out.println("Total Time: " + (end - begin) + " ms"); } // End function main() }

运行结果

结果一:没注释while{}那段代码

... ...

activeCount : 997

activeCount : 998

activeCount : 999

activeCount : 1000

activeCount : 1001

activeCountMain1 : 1001    // 程序会在这里停一段时间,再往下打印信息

activeCountMain2 : 1

Total Time: 5225 ms     

 

分析   

创建线程是很快的,所以每个线程之间的开始和结束间隔都很短;

而每个线程都需 要睡眠5秒钟,所以这里所消耗的总时间为5秒多一点。

 

结果二:注释掉while{}那段代码再运行

 ... ...

 activeCount : 997

 activeCount : 998

 activeCount : 999

 activeCount : 1000

 activeCount : 1001

 activeCountMain1 : 1001

 activeCountMain2 : 1001

 Total Time: 184 ms         

 

分析

程序几乎是直接就执行到最后,但是main方法还没结束,需要等一段时间后才结束。

这样只能得到创建所有线程所消耗的时间。

 

总结

总时间 = 创建线程时间 + 等待所有线程睡眠结束时间

 

其他方案

1、把时间统计放在@Override的run()方法里面

这样只能统计单独统计每一个线程所消耗的时间,创建线程的时间被忽略掉(当然忽略掉也没所谓,因为太短了)。

但是还有一个很重要的问题:难以统计线程消耗的总时间。可以把时间输入到一个临时文件,然后再统计,

不过太麻烦了,效率低。有人会用线程通信来统计,这样可能要写一大段的代码,估计也效率不咋的。

 

2、把创建的线程放进一个List,然后使用遍历List的时候给每一个线程加上一个join(),等待每一个线程结束

这样的方法把多线程变成顺序执行了,是单线程了。

 

转载于:https://www.cnblogs.com/tobeme/p/mutipleThread.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值