Нужно ли делать future.get () для Future, который не возвращает значение, которое мне небезразлично? - PullRequest
1 голос
/ 24 ноября 2011

Мое Java-приложение использует java.util.concurrent.Executors.newCachedThreadPool() для запуска различных потоков, выполняющих различные виды работы.

Некоторые потоки возвращают значение. Для этого я использую Future.get() для извлечения значения из потока.

Другие потоки не возвращают значение, которое меня волнует. Они объявлены как возвращающие Object, а возвращаемое значение всегда равно null. Для этих потоков я в настоящее время звоню Future.get(), хотя нет никакого значения, чтобы получить. Это необходимо или бессмысленно? Я думал, что, возможно, Future.get() уведомляет пул потоков, что я закончил с этим потоком.

Ответы [ 3 ]

1 голос
/ 24 ноября 2011

Короткий ответ - нет.Однако, если вы хотите проверить, что все выполнено успешно, Future.get () сообщит вам, было ли исключение ExecutionException (выбрасывая его).Поэтому я обычно называю это, даже если нет «результата», который меня волнует.YMMV в зависимости от того, как вы делаете обработку ошибок.

Как упоминает Том Андерсон, Callable<Void> - это возможность напомнить людям, что «результата» нет.Но, честно говоря, мои Callables, предназначенные для исполнителя, почти всегда возвращают себя, так что вы можете действительно проверить результаты дважды, если это будет необходимо.например (несколько преувеличено)

public class LongCalculation implements Callable<LongCalculation> {

   public double getResult() { ... }
   public SomeEnum getStatus() { ... } // e.g. FAILED, SUCCESS, CANCELLED
   public List<String> getAnythingWeirdThatHappenned() { ... }
}
1 голос
/ 24 ноября 2011

Нет ничего плохого в вызове Future.get () для вызываемой задачи, которая возвращает ноль. Имейте в виду, что Future.get () блокирует выполнение потока. сделав это, вы действительно заставите рабочий поток работать синхронно с вызывающим потоком. Как указано в названии, Future.get () - это что-то из будущего, поэтому вызывающему потоку нужно ждать.

0 голосов
/ 24 ноября 2011

Насколько я знаю, в документации ничего не сказано по этому вопросу. Но это означает, что ничто не говорит о том, что вам нужно это делать. Было бы довольно странно, если бы вам это было нужно - было бы очень легко случайно испортить пул потоков, забыв.

Кроме того, популярным выбором для этих Callables с нулевым возвратом является Callable<Void>. Void - это недопустимый заполнитель класса , так что это хороший выбор для переменных, которые когда-либо будут только нулевыми.

...