测量多个线程的执行时间

时间:2016-02-28 15:35:10

标签: java multithreading time measure

我想测量完整的执行时间(所以当完成所有线程时)。 .Where(x=>x.Reply==null).Tolist() 的技巧在这里不起作用,因为当main方法结束时,我自己创建的线程仍然会运行,因为它们需要比main方法更长的处理时间。 我该怎么做?

我举一个例子。

if let page1 = page1,
  page2 = page2 {
    pages = [page1, page2] //Unwrapped values added to array, fixes error
}

2 个答案:

答案 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