Вопрос

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

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 могут планировать нити по сердечкам.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top