我在tomcat中运行的web应用程序中使用执行程序。每个到达tomcat的请求都会向Singleton ExecutorService提交一个新作业。 ExecutorService配置有12个线程,与可用的CPU数相同。大约60个并发请求,我注意到在Callable中完成作业的时间与通过Future.get()获得结果的时间之间存在显着差异。伪代码下面显示了用例。
我有一个Callable,例如
public class DoSomething implements Callable<long> {
public long call() {
long start = System.currentTimeMillis();
//do some cpu intensive task
long end = System.currentTimeMillis();
System.out.println("time taken: " + (end-start));
return end-start;
}
}
当我将上面的Callable传递给ExecutorService时,例如
long realStart = System.currentTimeMillis();
ExecutorService service = Executors.newFixedThreadPool(12);
Future<DoSomething> x = service.submit(new DoSomething());
long y = x.get();
long realEnd = System.currentTimeMillis();
long realTimeTaken = realEnd - realStart;
我所观察到的是,在DoSomething中所花费的时间是40ms,其中 - realTimeTaken长达500ms。