Future.get() возвращает результаты намного позже, чем доступно в Java 8

Я использую исполнителя внутри веб-приложения, работающего в tomcat. Каждый запрос, поступающий на tomcat, отправляет новое задание в одноэлементную службу ExecutorService. Служба ExecutorService настроена на 12 потоков, что соответствует количеству доступных процессоров. Около 60 одновременных запросов, я заметил, что существует значительная разница между тем, когда работа завершена в Callable, по сравнению с тем, когда результаты доступны через Future.get(). Ниже псевдокод показывает вариант использования.

У меня есть вызываемый, такой как

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, составляет около 40 мс, а realTimeTaken - до 500 мс.

0 ответов

Другие вопросы по тегам