как работают FutureTasks и CachedThreadPool - PullRequest
2 голосов
/ 05 марта 2010

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

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 Ответ

2 голосов
/ 05 марта 2010

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

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

...