Должен ли я вызвать отменить (true) в Future <?> Или в моем FutureTask - PullRequest
3 голосов
/ 13 февраля 2012

У меня есть пользовательский класс MyFutureTask extends FutureTask<Void>, для которого я делаю некоторый код для метода done().

Я использую ExecutorService, в которую я вызываю submit(new MyFutureTask()).

Теперь я могу сохранить ссылку на Future<?>, который возвращается после того, как вы вызвали submit, но когда я вызываю отмену, метод isCancelled() никогда не возвращает true.

Должен ли я игнорироватьFuture<?> объект, который возвращается и вместо этого работает с MyFutureTask и вместо этого вызывает cancel(true)?

Какая польза от объекта Future<?> тогда?

edit: В чем разница между Future и FutureTask в Java? из этого потока я понимаю разницу.

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

Ответы [ 2 ]

0 голосов
/ 13 февраля 2012

Также вы не можете «остановить» поездку по сети. Вы должны ждать, пока он не вернется или не истечет время ожидания. То, что вы делаете, называется Future.cancel (true), а затем, когда ваша поездка по сети возвращается, посмотрите и посмотрите, отменено ли будущее Future.isCancelled (). Тогда вы можете просто перестать делать то, что вы делали в будущем. Для всех намерений и целей это тот же эффект, как если бы вы могли отменить поездку по сети. Для конечного пользователя (т. Е. Клиентский код или вызывающий абонент) это будет выглядеть так же. Единственный побочный эффект, который вы можете заметить, - это если у вас есть только один поток, выполняющий задачи, и в этом случае поток, ожидающий в сетевой поездке, должен вернуться, прежде чем он поднимет следующую задачу. Если это проблема с использованием пула потоков.

Кроме того, если вы используете NIO или какую-либо библиотеку, вы можете сразу же перестать ждать результата, но это намного больше работы для кодирования.

0 голосов
/ 13 февраля 2012

Не используйте Executor.submit, вместо этого используйте Executor.execute, поскольку у вас уже есть Будущее. Когда вы вызываете submit, вы просто без необходимости переносите свою FutureTask в другой FutureTask.

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