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

Java 如何获得多线程应用程序中作业执行持续时间的准确时间戳?,java,multithreading,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(); 示

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

  • 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();
示例代码(一个线程的)--

但是,每个线程的时间都是相同的

更新

这是我得到的输出

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

您应该使用System.nanoTime()更准确、更快



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

您应该使用System.nanoTime()更准确、更快



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

首先,发布更多的代码,这样我们就可以看到您真正在做什么,以及您希望使用的日期格式等等

然后:SimpleDataFormat的Javadoc说:

同步

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


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

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

然后:SimpleDataFormat的Javadoc说:

同步

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


这可能会导致您看到的结果。

使用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!

关于nanoTime调用,有一个很好的线索可以深入到技术细节中。

使用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!
有一个很好的线索可以深入到nanoTime调用的技术细节中。

tl;博士 2018-01-23T04:52:47.830065Z

对于经过的时间:

Duration.between( instantThen , Instant.now() ) 
java.time 现代方法使用java.time类,而不是像
Calendar
这样麻烦的旧日期时间类

该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)

虽然
瞬间
可以以纳秒为单位表示一个值,但它在捕获当前时刻时有局限性

  • 在Java8中,当前时刻最多只能捕获毫秒
  • 在Java9中,新的实现现在以更精细的粒度捕获当前时刻
在macOS Sierra上的Java 9.0.1中,我看到了用微秒捕捉到的当前时刻

2018-01-23T04:52:47.830065Z

要生成上述标准格式的字符串,只需调用
toString()

我建议在UTC中使用
即时
,并使用标准格式,以满足您的日志记录需求。但是如果您坚持不这样做,请参阅
DateTimeFormatter
&
ZonedDateTime

如果要计算经过的时间,请使用
Duration
class

Duration d = Duration.between( instantThen , Instant.now() ) ;
要报告,请调用
Duration::toString
在中生成字符串


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类
    • 对于早期的Android,该项目采用了ThreeTen Backport(如上所述)。看
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如、、和。

tl;博士 2018-01-23T04:52:47.830065Z

对于经过的时间:

Duration.between( instantThen , Instant.now() ) 
java.time 现代方法使用java.time类,而不是像
Calendar
这样麻烦的旧日期时间类

该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)

虽然
瞬间
可以以纳秒为单位表示一个值,但它在捕获当前时刻时有局限性

  • 在Java8中,当前时刻最多只能捕获毫秒
  • 在Java9中,新的实现现在以更精细的粒度捕获当前时刻
在macOS Sierra上的Java 9.0.1中,我看到了用微秒捕捉到的当前时刻

2018-01-23T04:52:47.830065Z

要生成上述标准格式的字符串,只需调用
toString()

我建议将UTC中的
即时
与标准
String output = Instant.now().toString() ;
Duration d = Duration.between( instantThen , Instant.now() ) ;