Как работают Futuretasks и CachedThreadool
-
24-09-2019 - |
Вопрос
В настоящее время у меня есть код, который делает следующее:
private final static ExecutorService pool = Executors.newCachedThreadPool();
public void foo(){
FutureTask<MyObject> first_task = createFutureTask();
FutureTask<MyObject> second_task = createFutureTask();
...
pool.execute(first_task);
pool.execute(second_task);
....
first_task.get();
second_task.get();
...
System.out.println(time taken);
}
Проблема у меня есть, это то, что я получаю каждую будущую задачу, чтобы распечатать время, когда они принимают при выполнении вычислений, поэтому, например, на консоли, я увижу
first_task : 20000ms
second_task : 18000ms
...
но общее время (System.out.println(time taken)
) гораздо больше, чем самое длинное время, предпринятое любую будущую задачу, поэтому в соответствии с этим примером метод занимает около 1 минуты (по сравнению с 20-х годов First_Task).
Я находился под впечатлением, что эти будущие задачи работают параллельно, но из времени, как кажется, они бегают один за другим. Я правильно использую эту API?
Решение
Вы используете API правильно, но имейте в виду, что каждая задача работает в отдельном потоке, а не отдельный процесс (и, таким образом, не обязательно параллельно).
Каждый поток должен будет работать в отдельном ядре CPU, чтобы на самом деле выполнить одновременно. Можно ли это возможно, зависит от вашей машины, его текущей нагрузки и того, как JVM и OS могут планировать нити по сердечкам.