2011-05-05 54 views
0

如何添加時間戳到多線程程序在那裏我有:如何在多線程應用程序中獲取作業執行持續時間的準確時間戳?

  • J3依賴於J1 & J2
  • J5依賴J4

,並獲得不同的時間每個作業的執行(線)。我有J1,J2,J3(我已經加入J1 & J2),J4,J5(我已經加入J4)和J6(我開始所有線程)的6個不同文件。

我已經加入此功能:

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 
+0

您能否發表更多的代碼? – StKiller 2011-05-05 11:57:40

+2

你是否在所有線程中使用相同的'SimpleDateFormat'? – 2011-05-05 11:57:42

+0

是的。相同的日期格式代碼 – KLCoder 2011-05-05 11:58:46

回答

4

您應該使用System.nanoTime()更加準確和快得多。


日曆,您可以創建最昂貴的對象之一,並使用日期格式可能是非常低效的。 「:ms」沒有任何用處,所以我懷疑你只有第二個解決方案。如果你想毫秒使用「.SSS」按javadoc。

2

首先,發佈更多的代碼,以便我們可以看到您真正在做什麼以及您使用的日期格式等等。

然後:Javadoc文檔的SimpleDateFormat說:

同步

的SimpleDateFormat不是線程安全的。 用戶應爲每個線程創建一個單獨的 實例。

這可能會導致您看到的內容。

+0

線程示例 - \ npublic class Job1 extends Thread {String msg; public void run(){/ * DateFormat dateFormat = new SimpleDateFormat(「yyyy/MM/dd HH:mm:ss:ms」);日曆cal = Calendar.getInstance)System.out.println(「Job1 ---」+ dateFormat.format(cal.getTime())); */System.out.println(「開始執行job1(添加作業)」);的System.out.println(); System.out.print(「3 + 2 =」+(3 + 2));的System.out.println(); } Job1(String mg){msg = mg; }} – KLCoder 2011-05-05 12:06:26

+0

@KLCoder,上次我建議你在你的問題中放置格式化的示例代碼。 ;) – 2011-05-05 12:10:24

+0

哈哈肯定。我不知道這樣的評論會來。對不起 – KLCoder 2011-05-05 12:11:32

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調用的細節。

+0

其實我想要的線程啓動當前時間不是經過的時間 – KLCoder 2011-05-05 12:28:56

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::toStringstandard ISO 8601 format生成的字符串。


關於java.time

java.time框架是建立在Java 8和更高版本。這些類代替了日期時間類legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time項目現在位於maintenance mode,建議遷移到java.time類。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。規格是JSR 310

從何處獲取java.time類?

ThreeTen-Extra項目與其他類擴展java.time。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如Interval,YearWeek,YearQuartermore