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中,新的实现现在以更精细的粒度捕获当前时刻李>
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(如上所述)。看
Duration.between( instantThen , Instant.now() )
java.time
现代方法使用java.time类,而不是像Calendar
这样麻烦的旧日期时间类
该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)
虽然瞬间
可以以纳秒为单位表示一个值,但它在捕获当前时刻时有局限性
- 在Java8中,当前时刻最多只能捕获毫秒李>
- 在Java9中,新的实现现在以更精细的粒度捕获当前时刻李>
toString()
我建议将UTC中的即时与标准
String output = Instant.now().toString() ;
Duration d = Duration.between( instantThen , Instant.now() ) ;