我搜索过测量Java应用程序的执行时间,我得到了这段代码:
long start= System.currentTimeMillis();
//TODO
long stop= System.currentTimeMillis();
开始和停止之间的差异给我执行时间。
注意:我知道这不是确切的执行时间。我只需要时间来比较多线程和单线程应用程序。
如果我更改我的代码怎么办:
long start= System.currentTimeMillis();
//something...
Thread t1= new Thread(new blabla(0, 10), "T - 1");
t1.start();
Thread t2= new Thread(new blabla(10, 20), "T - 2");
t2.start();
//Consider I've 10 threads like this
//something more
long stop = System.currentTimeMillis();
10个线程执行。他们做什么都没关系。假设他们正在随机填充二维数组。
现在,停止 - 开始给我“整个”执行时间?或者我必须自己测量线程?
答案 0 :(得分:1)
您的多线程示例不会按照您希望的方式工作,因为当您在线程上调用start()
时,它将同时运行。所以基本上发生的是你启动所有10个线程,并且有可能在你调用
long stop = System.currentTimeMillis();
如果要测量完成任务所需的完整运行时间,则必须等待所有线程先完成,您可以这样做:
long start = System.currentTimeMillis();
List<Thread> threads = new ArrayList<>();
for (int i = 0; i < 10; ++i) {
Thread t = new Thread(new blabla(i * 10, (i + 1) * 10), "T - " + (i + 1));
t.start();
threads.add(t);
}
// and now wait for all of them to complete
for (Thread t : threads) {
t.join();
}
long stop = System.currentTimeMillis();
请注意,这仅适用于您的线程在执行后终止的情况(即您的blabla
runnable无法在无限循环中运行)。
或者,您可以使用ExecutorService(例如Executors.newFixedThreadPool(10)
,请参阅the Java API),您可以提交任务并等待所有任务的终止。
答案 1 :(得分:0)
final long startTime = System.currentTimeMillis();
// do multi threaded work
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
System.out.println("Shutdown Hook is running !");
final long endTime = System.currentTimeMillis();
System.out.println("Calculated in: " + (endTime - startTime) / 1000 + " seconds" );
}));