Java cancel Future-как дождаться финиша?
короче говоря: у меня есть коллекция Future
объекты. Некоторые из них уже осуществляются, другие-нет. Я повторяю коллекцию и вызываю future.cancel(false)
который, согласно документации, должен отменить все Future
s, которые в настоящее время не работают, но должны позволить завершить все остальные.
мой вопрос: Как я знаю, когда конкретный Future
завершается после того, как я назвал future.cancel(false)
? future.isDone()
всегда возвращает true
, потому что cancel()
действительно называется до этого и future.get()
всегда бросает!--9--> хотя Future
по-прежнему работает.
какие предложения?
3 ответов
С Future
моделирует будущий результат ожидающего вычисления, и поскольку этот результат не ожидается из отмененного будущего, разумно, что Future
не дает вам возможности узнать, когда завершится вычисление, результат которого был удален. Другими словами, вам понадобится другая парадигма для достижения вашей цели с помощью этого подхода.
Если вы хотите дождаться завершения всех представленных задач, ближайшая вещь, которая непосредственно поддерживается API службы исполнителя должен закрыть всю службу исполнителя и дождаться ее завершения.
Если вышеизложенное не соответствует вашему решению, то я не вижу лучшего подхода, чем какое-либо пользовательское решение, например пользовательская реализация Runnable
, который делает некоторую уборку сбоку, чтобы вы могли проверить, когда он завершил работу.
вы можете добавить флаг в свою будущую реализацию, которая будет отражать фактическое будущее " состояние
дали Callable<Object> c
:
futureTask1 = new FutureTask<Object>(c);
futureTask2 = new FutureTask<Void>(futureTask1, null);
executor.execute(futureTask2);
теперь, если вы хотите в итоге:
futureTask1.get()
если вы больше не заинтересованы в результате:
futureTask1.cancel(mayInterruptIfRunning)
если вы хотите подождать, чтобы убедиться, что код в вызываемом не работает (и не станет) (независимо от того, никогда не вызывался, закончил отмену или закончил получение результата):
futureTask2.get()
даже если отменено до начала работы, это ожидает, что исполнитель выполнит запланированную задачу (которая будет ничего, если уже отменили), так что это может unnecessariliy ждать других длительных задач, чтобы завершить. YMMV