Java: ExecutorService с Callables: invokeAll () и future.get () - результаты в правильном порядке? - PullRequest
2 голосов
/ 09 марта 2012

Я использую ExecutorService в Java для вызова потоков с invokeAll().После этого я получаю набор результатов с future.get().Очень важно, чтобы я получал результаты в том же порядке, в котором я создал потоки.

Вот фрагмент:

try {
    final List threads = new ArrayList();

    // create threads
    for (String name : collection)
    {
        final CallObject object = new CallObject(name);
        threads.add(object);
    }

    // start all Threads
    results = pool.invokeAll(threads, 3, TimeUnit.SECONDS);

    for (Future<String> future : results)
    {
        try
        {
            // this method blocks until it receives the result, unless there is a 
            // timeout set.
            final String rs = future.get();

            if (future.isDone())
            {
                // if future.isDone() = true, a timeout did not occur. 
               // do something
            }
            else
            {
                // timeout
                // log it and do something
                break;
            }
        }
        catch (Exception e)
        {
        }
    }

}
catch (InterruptedException ex)
{
}

Уверен ли я, что получу результаты из future.get () в том же порядке я создал новые CallObjects и добавил их в мой ArrayList?Я знаю, в документации сказано следующее: invokeAll(): returns a list of Futures representing the tasks, in the same sequential order as produced by the iterator for the given task list. If the operation did not time out, each task will have completed. If it did time out, some of these tasks will not have completed. Но я хотел убедиться, что правильно понял ...

Спасибо за ответы!: -)

Ответы [ 2 ]

4 голосов
/ 09 марта 2012

Это именно то, что говорит этот фрагмент утверждения:

возвращает список фьючерсов, представляющих задачи, в том же последовательный порядок, создаваемый итератором для заданного списка задач.

Вы получите Future с в том порядке, в котором вы вставили предметы в исходный список Callable с.

1 голос
/ 15 августа 2014

Согласно документации вы получите фьючерсы в том же порядке.

Будущий объект - это просто ссылка на задачу.

Future#get() is blocking call.

Для бывших

Мы представили 4 задания.

Задача 1 -> Завершено

Задача 2 -> Завершено

Задача 3 -> Тайм-аут

Задача 4 -> Завершено

В соответствии с нашим кодом

for (Future future : futures) {
  future.get(); }

Для 1 и 2 секундного задания оно вернется немедленно.Мы будем ждать, когда третье задание будет выполнено.Даже четвертое задание выполнено, итерация ожидает третьего задания.После того, как третье задание будет выполнено или время ожидания истечет, будет продолжаться только итерация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...