我写了一个应用程序,它读取文本文件中的所有行并测量时间。我想知道整个街区的时间是多少。 例如,如果我同时启动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)。多线程的好思路是在这种情况下,线程块的时间,是从线程获得的最大时间吗?我想是的,因为在最大时间的线程停止时,其他线程将停止工作。
或者我应该以另一种方式思考?
答案 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中不是线程安全的,因此不允许在线程之间共享Reader
或InputStream
!
答案 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;
通过这个你可以计算。