测量多线程Java应用程序的执行时间

时间:2016-05-11 20:46:59

标签: java multithreading

我搜索过测量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个线程执行。他们做什么都没关系。假设他们正在随机填充二维数组。

现在,停止 - 开始给我“整个”执行时间?或者我必须自己测量线程?

2 个答案:

答案 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" );
    }));