如何在多线程应用程序中获取作业执行持续时间的准确时间戳?

时间:2011-05-05 11:55:43

标签: java multithreading

如何将时间戳添加到我所拥有的多线程程序中:

  • J3依赖于J1& J2
  • J5依赖于J4

获得每个工作(线程)执行的不同时间 我有6个不同的文件J1,J2,J3(我加入了J1和J2),J4,J5(我加入了J4)和J6(我开始所有线程)。

我添加了这个功能:

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss:ms");
Calendar cal = Calendar.getInstance();

示例代码(一个线程) -

import java.io.*;
import java.*;
import java.util.*;
import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class Job1 extends Thread{
String msg;
public void run()
{


System.out.println("Execution of job1 (addition job) started");
System.out.println();
System.out.print("3+2=" +(3+2));
System.out.println();
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss:ms");
Calendar cal = Calendar.getInstance();
     }

     Job1(String mg)
     {
      msg=mg;
     }

     }

但是,我每个帖子都得到相同的时间。

更新

这是我得到的输出。

C:\Program Files\Java\jdk1.6.0_03\bin>javac threadcontainer.java
C:\Program Files\Java\jdk1.6.0_03\bin>java threadcontainer
J1->4719906194666
J2->4719906696464
Execution of job1 (addition job) started
3+2=5
J4->4719911159535
Execution of job4 (multiplication job) started
3*2=6Job 5 executing
J5-> 4719911737462
Execution of job2 (subtraction job) started
3-2=1Job 3 executing
J3->4719912405874

4 个答案:

答案 0 :(得分:4)

你应该使用System.nanoTime()更准确,更快。


日历是您可以创建的最昂贵的对象之一,使用日期格式可能效率非常低。 “:ms”没有做任何有用的事情,所以我怀疑你只有第二个分辨率。如果你想要毫秒使用“.SSS”按照javadoc。

答案 1 :(得分:2)

首先,发布更多代码,以便我们可以看到您正在做什么以及您使用日期格式等等。

然后:SimpleDateFormat的Javadoc说:

  

同步

     

SimpleDateFormat不是线程安全的。   用户应该创建一个单独的   每个线程的实例。

这可能会导致你看到的内容。

答案 2 :(得分:0)

使用java.lang.System.nanoTime()来测量经过的时间 - 这是您可以使用的最准确的计时器。它虽然是一个任意的计数器(它不代表一个时间,它只计算纳秒),所以你需要像这样使用它:

long t1 = System.nanoTime(); 

// do something

long t2 = System.nanoTime();

long elapsedTime = t2 - t1; // in nano-seconds, so remember to scale!

有一个很好的帖子here可以深入了解nanoTime调用的技术细节。

答案 3 :(得分:0)

TL;博士

Instant.now()       // Current moment in UTC
       .toString()  // Generate string in standard ISO 8601 format.
  

2018-01-23T04:52:47.830065Z

经过时间:

Duration.between( instantThen , Instant.now() ) 

java.time

现代方法使用 java.time 类而不是麻烦的旧遗留日期时间类,例如Calendar

Instant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。

Instant instant = Instant.now() ;  // Capture current moment in UTC.

虽然Instant可以表示以纳秒为单位的值,但它有捕获当前时刻的限制。

  • 在Java 8中,当前时刻仅捕获到毫秒。
  • 在Java 9中,新的Clock实现现在以更精细的粒度捕获当前时刻。

在macOS Sierra上的Java 9.0.1中,我看到当前时刻以微秒为单位。

  

2018-01-23T04:52:47.830065Z

要生成上面标准ISO 8601格式的字符串,只需致电toString()

String output = Instant.now().toString() ;

我建议使用UTC中的Instant标准格式来满足您的日志记录需求。但如果你坚持不这样做,请参阅DateTimeFormatter& ZonedDateTime课程。

如果您要计算已用时间,请使用Duration课程。

Duration d = Duration.between( instantThen , Instant.now() ) ;

要报告,请致电Duration::toString以在standard ISO 8601 format生成字符串。

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore