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 мс.