如何检查线程的时间?

时间:2015-02-02 10:07:00

标签: java multithreading

我写了一个应用程序,它读取文本文件中的所有行并测量时间。我想知道整个街区的时间是多少。 例如,如果我同时启动2个线程:

for (int i = 0; i < 2; i++) {
        t[i] = new Threads(args[j], 2);
        j++;
    }

    try {
        Thread.sleep(500);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }       

    System.out.println("TIME for block 1 of threads; "
            + (max(new long[]{t[0].getTime(),t[1].getTime()})));

等待他们停止处理文件并读取操作时间(通过getTime)。多线程的好思路是在这种情况下,线程块的时间,是从线程获得的最大时间吗?我想是的,因为在最大时间的线程停止时,其他线程将停止工作。

或者我应该以另一种方式思考?

3 个答案:

答案 0 :(得分:1)

拥有多个线程时,争论执行顺序是危险的!例如。如果在单核CPU上运行代码,则线程不会真正并行运行,而是顺序运行,因此两个线程的总运行时间是每个线程的运行时间的总和,而不是两者的最大值。

幸运的是,如果你使用ExecutorService而不是直接使用Thread来测量这个是非常简单的方法(顺便说一下,这总是一个很好的建议):

// 1. init executor
int numberOfThreads = 2; // or any other number
int numberOfTasks = numberOfThreads; // is this true in your case?
ExecutorService executor = Executors.newFixedThreadPool(numberOfThreads);

long startTime = System.currentTimeMillis();

// 2. execute tasks in parallel using executor
for(int i = 0; i < numberOfTasks; i++) {
    executor.execute(new Task()); // Task is your implementation of Runnable
}

// 3. initiate shutdown and wait until all tasks are finished
executor.shutdown();
executor.awaitTermination(1, TimeUnit.MINUTES); // we won't wait forever

// 4. measure time
long delta = System.currentTimeMillis() - startTime;

现在,delta保存了您的任务的总运行时间。您可以使用numberOfThreads来查看更多或更少的线程是否会产生不同的结果。

重要提示:从文件中读取在Java中不是线程安全的,因此不允许在线程之间共享ReaderInputStream

答案 1 :(得分:0)

就我而言,您可以使用System类的静态方法。 您可以在块的开始和块的结束时使用它,并在较早的时间减去后一个。 那些是:

System.currentTimeMillis(); // The current value of the system timer, in miliseconds.

System.nanoTime(); //The current value of the system timer, in nanoseconds.

答案 2 :(得分:0)

你可以使用 块的开始

long startTime = System.currentTimeMillis();

阻止结束

long endTime = System.currentTimeMillis()- startTime;

通过这个你可以计算。