2015-06-18 4 views
0

У меня возникли некоторые вопросы относительно использования Future. Пожалуйста, перейдите к примеру ниже, прежде чем обращаться к моим запросам.Запросы о Java Future and RejectionHandler

http://javarevisited.blogspot.in/2015/01/how-to-use-future-and-futuretask-in-Java.html

  1. Основная цель использования пулов потоков & Executors это выполнить задачу асинхронно, не блокируя основной поток. Но как только вы используете Future, он блокирует вызывающий поток. Нужно ли создавать отдельный пул потоков/потоков для анализа результатов задач Callable? ИЛИ есть ли другое хорошее решение?
  2. С Future вызов блокирует вызывающего абонента, стоит ли использовать эту функцию? Если я хочу проанализировать результат задачи, я могу иметь синхронный вызов и проверять результат вызова без Future.
  3. Каков наилучший способ справиться с отклоненными задачами с использованием RejectionHandler? Если задача отвергается, следует ли перевести задачу на другой поток или ThreadPool или отправить эту же задачу в текущую ThreadPoolExecutor?

Пожалуйста, исправьте меня, если мой мыслительный процесс не соответствует этой функции.

+1

Фьючерсы do * not * блокируют вызывающую нить. Угадайте, почему существует * цикл * в примере кода, который вы связали? Потому что 'isDone' делает * not * wait. Несмотря на то, что в примере цикла опрос 'isDone' в цикле все еще плохой стиль кодирования. Если вы хотите подождать, вы можете использовать 'get', и если вы не хотите, чтобы поток вызывающего абонента был заблокирован, вы можете [указать тайм-аут] (http://docs.oracle.com/javase/8/docs/ api/java/util/concurrent/Future.html # get-long-java.util.concurrent.TimeUnit-) – Holger

+1

Посмотрите на [документацию «RejectedExecutionHandler», «Все известные классы реализации»] (http: // docs. oracle.com/javase/8/docs/api/java/util/concurrent/RejectedExecutionHandler.html) для предложений по использованию стратегий. – Holger

+0

Есть ли какой-либо API из будущего, чтобы получать уведомление, когда результат доступен, поскольку тайм-аут полностью не служит цели? Если это не доступно, лучше ли использовать Future и выполнять задачу синхронно в самой теме звонящего? –

ответ

1

Ваш вопрос о выполнении действия при выполнении асинхронного действия. Future s, с другой стороны, хороши, если у вас есть несвязанная деятельность, которую вы можете выполнять во время выполнения асинхронного действия. Затем вы можете регулярно проверять действие, представленное Future, на isDone() и делать что-то еще, если нет, или вызвать блокировку get(), если у вас больше нет несвязанной работы для вашего текущего потока.

Если вы хотите запланировать выполнение по завершении без блокировки текущего потока, вы можете вместо этого использовать CompletableFuture, который предлагает такую ​​функциональность.

0

CompletableFuture подходит для запросов 1 и 2, как было предложено @Хольгера

Я хочу обновить около RejectedExecutionHandler механизма относительно запроса 3.

Java обеспечивает четыре типа политики Неприятие Handler согласно javadocs ,

  1. В умолчанию ThreadPoolExecutor.AbortPolicy, обработчик бросает выполнения RejectedExecutionException на отказ.

  2. В ThreadPoolExecutor.CallerRunsPolicy поток, запускающий выполнение, выполняет задание. Это обеспечивает простой механизм управления с обратной связью, который замедляет скорость подачи новых задач.

  3. В ThreadPoolExecutor.DiscardPolicy задача, которая не может быть выполнена, просто отбрасывается.

  4. В ThreadPoolExecutor.DiscardOldestPolicy, если исполнитель не закрыт, задача во главе рабочей очереди отбрасывается, а затем выполняется повторное выполнение (что может снова потерпеть неудачу, в результате чего это будет повторяться.)

CallerRunsPolicy: Если у вас есть задачи в очереди задач, с помощью этой политики приведет к ухудшению производительности. Вы должны быть осторожны, поскольку задачи отклонения будут выполняться самим потоком. Если выполнение отклоненной задачи имеет решающее значение для вашего приложения и у вас ограниченная очередь задач, вы можете использовать эту политику.

DiscardPolicy: Если отбрасывание некритического события вас не беспокоит, вы можете использовать эту политику.

DiscardOldestPolicy: Выбросьте старую работу и попытаться возобновить последний

Если ни один из них не подходит для ваших потребностей, вы можете реализовать свой собственный RejectionHandler.

Смежные вопросы