Future.get()在java 8中可用后很久就返回结果

时间:2015-02-21 05:11:31

标签: java tomcat parallel-processing executorservice threadpoolexecutor

我在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。

0 个答案:

没有答案