我想测量完整的执行时间(所以当完成所有线程时)。
.Where(x=>x.Reply==null).Tolist()
的技巧在这里不起作用,因为当main方法结束时,我自己创建的线程仍然会运行,因为它们需要比main方法更长的处理时间。
我该怎么做?
我举一个例子。
if let page1 = page1,
page2 = page2 {
pages = [page1, page2] //Unwrapped values added to array, fixes error
}
答案 0 :(得分:3)
您可以使用ExecutorService
:
long startTime = System.nanoTime();
ExecutorService executorService = Executors.myPool();
for(conditions)
executorService.submit(new myThread());
然后不要忘记shutdown()
:
启动有序关闭,其中先前提交的任务已执行,但不会接受任何新任务。如果已经关闭,调用没有额外的效果。
executorService.shutdown();
wait:
阻止所有任务在关闭请求之后完成执行,或发生超时,或者当前线程被中断,以先发生者为准。
executorService.awaitTermination(1, TimeUnit.HOUR); // however long you need
然后计算:
long totalTime = System.nanoTime() - startTime;
System.out.printf("The total time everything took was %.3f ms %n", totalTime/1e6);
答案 1 :(得分:0)
在测量结束时间之前,您应该考虑使用thread Joins。这将确保主线程仅在所有其他线程退出时退出。
package threadsync;
public class MeasureRunningTime {
public static void main(String[] args) {
long start = System.currentTimeMillis();
Thread th = new Thread(){
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
};
};
th.start();
try {
th.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
long end = System.currentTimeMillis();
System.out.println("The thread took:" + (end - start) + "ms");
}
}
在这种情况下的输出应该是:
线程花了:5003ms