我正在使用多线程运行一个简单的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))
}
}
答案 0 :(得分:1)
totalTime
的访问权限应为synchronized和volatile。如果没有同步,不同的线程将在该值上进行写入。没有volatile,不同的线程可以看到不同的值。您可以使用诸如AtomicLong
之类的包装类来简化访问。
根据您使用的平台,您可以避免使用AOP使用不相关的计时代码来污染您的服务类。大多数DI框架(包括Guice和Spring)都支持这一点。
答案 1 :(得分:1)
访问totalTime应该是线程安全的。您可以使用AtomicLong
final AtomicLong timeTaken = new AtomicLong(0);
// later
timeTaken.addAndGet(endTime - startTime);
您可能希望使用System.nanoTime()
代替System.currentTimeMillis()
来获得更高的分辨率。