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



如何在多线程程序中添加时间戳:

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

获取每个作业(线程)的不同执行时间。
我有J1, J2, J3 6个不同的文件(我加入了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 FilesJavajdk1.6.0_03bin>javac threadcontainer.java
C:Program FilesJavajdk1.6.0_03bin>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()更准确,更快。


Calendar是您可以创建的最昂贵的对象之一,并且使用日期格式可能非常低效。":ms"没有做任何有用的事情,所以我怀疑你只有第二个解决方案。如果你想要毫秒级的使用。

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

然后:Javadoc for SimpleDateFormat说:

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

这可能导致你所看到的

使用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调用的技术细节。

br

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

2018 - 01 - 23 - t04:52:47.830065z

表示运行时间:

Duration.between( instantThen , Instant.now() ) 
<标题> java.time h1> ava。time类,而不是麻烦的旧的遗留日期时间类,如Calendar .

Instant类表示UTC时间轴上的时刻,分辨率为纳秒(最多九(9)位小数)。

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

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

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

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

2018 - 01 - 23 - t04: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以生成标准ISO 8601格式的字符串。


关于java.time

java。时间框架内置于Java 8及以后版本中。这些类取代了麻烦的旧的遗留日期时间类,如java.util.Date, Calendar, &SimpleDateFormat .

Joda-Time项目现在处于维护模式,建议迁移到java。时间类。

要了解更多信息,请参阅Oracle教程。并搜索Stack Overflow以获得许多示例和解释。规格为JSR 310。

从哪里获取java。时间类?

  • Java SE 8Java SE 9,以及更高版本
    • 内置。
    • 标准Java API的一部分,捆绑实现。
  • Java 9增加了一些小的特性和修复。
  • Java SE 6Java SE 7
    • 大部分java。时间功能向后移植到Java 6;7在 ThreeTen-Backport
  • Android
    • Android版本的java bundle实现。时间类。
    • 对于早期的Android, ThreeTenABP项目适应ThreeTen-Backport(如上所述)。参见如何使用ThreeTenABP…
  • ThreeTen-Extra项目扩展了java。有额外课程的时间。这个项目是将来可能添加到java.time的试验场。您可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter等。

    最新更新