3

我需要计算运行我编写的应用程序的每个线程需要多长时间,并且我已经完成并得到了结果,但实际上并没有任何好的方法来验证我是否做对了。我以前从来没有做过这样的事情。如果有人可以给我一个快速校对,那将非常有帮助。

这是创建线程的代码:

for (int i = 0; i < ROWS; i++) {
    threads[threadCount] = new Thread(new TextDistanceThread("Macbeth.txt", "Othello.txt", i, 0));
    threads[threadCount++].start();
    threads[threadCount] = new Thread(new TextDistanceThread("Macbeth.txt", "HuckFinn.txt", i, 1));
    threads[threadCount++].start();
    threads[threadCount] = new Thread(new TextDistanceThread("Macbeth.txt", "TomSawyer.txt", i, 2));
    threads[threadCount++].start();
    threads[threadCount] = new Thread(new TextDistanceThread("Othello.txt", "HuckFinn.txt", i, 3));
    threads[threadCount++].start();
    threads[threadCount] = new Thread(new TextDistanceThread("Othello.txt", "TomSawyer.txt", i, 4));
    threads[threadCount++].start();
    threads[threadCount] = new Thread(new TextDistanceThread("TomSawyer.txt", "HuckFinn.txt", i, 5));
    threads[threadCount++].start();
}

以及线程本身的代码:

public void run() {

    long start = ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime();

//DO SOME STUFF

    long end = ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime();

    Driver.timeResults[0][row][col] = end - start;
    Driver.results[row][col] = difference;
}
4

2 回答 2

1

您要么想要每个线程经过的时间,要么想要从System.currentTime();开始的“真实”经过时间 您的代码获取每个线程的时间,这并不总是与实际经过的时间相同。如果那是您的意图,那么您的实现应该可以工作。

验证时序行为的一种简单方法是在已知持续时间内运行任务。 Thread.sleep(), 例如。尝试与Thread.sleep()忙等待(即while(System.currentTimeMillis() < timeInTheFuture) {})进行比较,您会注意到 CPU 时间可能会有所不同。不要期望高精度,但您仍然可以使用它来验证您的假设。如果您启动五个线程,每个线程工作 30 秒,您是否会为每个线程返回大约 30 秒?然后它正在做你期望的事情。

也就是说,看起来您将计时信息存储在一个数组中,这不是一个好主意。 数组不是线程安全的。对于您的情况,最简单的方法可能是创建一个ConcurrentHashMap<String, Long>键是线程名称的位置,例如

timeResults.put(Thread.currentThread().getName(), end - start);
于 2015-09-23T22:30:43.873 回答
0

如果您想测量 CPU 在每个线程中花费的时间,那么是的,您的代码看起来是正确的。请注意,尽管它不会测量从线程开始到完成时的实际时间 - 因为您将使用System.nanoTime().

于 2015-09-23T22:22:04.450 回答