В Java, как я могу дождаться выполнения всех задач, но остановиться при первой ошибке? - PullRequest
6 голосов
/ 10 сентября 2009

У меня есть ряд параллельных задач для запуска. Если какой-либо из них потерпит неудачу, я хочу прервать их все и ждать завершения. Но при условии, что ни один из них не сработает, я хочу подождать, пока все они закончат.

ExecutorCompletionService похоже почти то, что я хочу здесь, но, похоже, нет способа узнать, все ли мои задачи выполнены, кроме как путем отдельного подсчета количества задач. (Обратите внимание, что оба примера в Javadoc для ExecutorCompletionService отслеживают количество «n» задач и используют его, чтобы определить, завершена ли служба.)

Я что-то пропускаю или мне действительно нужно самому писать этот код?

Ответы [ 2 ]

2 голосов
/ 10 сентября 2009

Да, вам нужно отслеживать, используете ли вы ExecutorCompletionService. Как правило, вы вызываете get () для фьючерсов, чтобы увидеть, произошла ли ошибка. Не перебирая задачи, как еще можно сказать, что одно не удалось?

1 голос
/ 10 сентября 2009

Если ваша серия задач имеет известный размер, то вам следует использовать второй пример в javadoc.

Однако, если вы не знаете, сколько заданий вы будете отправлять в CompletionService, у вас возникла проблема с источником-потребителем. Один поток создает задачи и помещает их в ECS, другой будет потреблять фьючерсы задач с помощью take (). Можно использовать общий семафор, что позволяет Производителю вызывать release (), а Потребителю - вызывать acqu (). Семантика завершения будет зависеть от вашего приложения, но будет достаточно энергозависимого или атомарного логического значения для производителя, чтобы указать, что это сделано.

Я предлагаю использовать семафор над ожиданием / уведомлением с помощью poll (), поскольку существует недетерминированная задержка между временем выполнения задачи и временем, когда будущее задачи доступно для потребления. Поэтому потребитель и производитель должны быть немного умнее.

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