Как работают FutureTasks и CachedThreadPool

В настоящее время у меня есть код, который делает следующее:

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?

1 ответ

Решение

Вы используете API правильно, но имейте в виду, что каждая задача выполняется в отдельном потоке, а не в отдельном процессе (и, следовательно, не обязательно параллельно).

Каждый поток должен был бы работать на отдельном ядре ЦП, чтобы фактически выполняться одновременно. Будет ли это возможно, зависит от вашей машины, ее текущей загрузки и от того, как JVM и ОС могут планировать потоки между ядрами.

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