2016-02-26 129 views
1

我使用多線程運行一個簡單的java程序。每個線程都調用一個服務。我想打印服務電話的總時間。請告知如何在多線程環境中執行此操作。我的代碼如下所示沒有給出正確的結果。請幫忙。如何計算java中的服務所花費的總時間?

public class ServiceCaller { 
    private long totalTime; 

    public void makeRequest() { 
     long startTime = System.currentTimeMillis(); 
     serviceCall() 
     long endTime = System.currentTimeMillis(); 
     totalTime = totalTime+(endTime-startTime); 
     System.out.println(DurationFormatUtils.formatDurationHMS(totalTime)) 
    } 
} 
+1

你的意思是「沒有給出正確的結果」是什麼意思?它在做什麼,你期望它做什麼? –

+0

如果我通過查看日誌文件手動計算總時間,它是不同的。 – user3492304

+0

如何/你在哪裏打印個人時間,以便可以完成它們? –

回答

1

訪問totalTime應該synchronizedvolatile。如果不同步,不同的線程將寫入該值。沒有易變的不同線程可以看到不同的值。您可以使用包裝類(例如AtomicLong)簡化訪問。

根據您使用的平臺,您可能能夠避免使用與AOP無關的時間碼污染您的服務等級。大多數DI框架(包括GuiceSpring)都支持此功能。

1

訪問總時間應該是線程安全的。您可以使用的AtomicLong

final AtomicLong timeTaken = new AtomicLong(0); 

// later 
timeTaken.addAndGet(endTime - startTime); 

你可能想使用System.nanoTime(),而不是System.currentTimeMillis()更大的分辨率。