2016-02-26 126 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()更大的分辨率。