如何计算java中服务的总时间?

时间:2016-02-26 10:45:15

标签: 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))
    }
}

2 个答案:

答案 0 :(得分:1)

totalTime的访问权限应为synchronizedvolatile。如果没有同步,不同的线程将在该值上进行写入。没有volatile,不同的线程可以看到不同的值。您可以使用诸如AtomicLong之类的包装类来简化访问。

根据您使用的平台,您可以避免使用AOP使用不相关的计时代码来污染您的服务类。大多数DI框架(包括GuiceSpring)都支持这一点。

答案 1 :(得分:1)

访问totalTime应该是线程安全的。您可以使用AtomicLong

final AtomicLong timeTaken = new AtomicLong(0);

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

您可能希望使用System.nanoTime()代替System.currentTimeMillis()来获得更高的分辨率。