[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(),等待每一个线程结束
这样的方法把多线程变成顺序执行了,是单线程了。