Из того, что я знаю, CancellationException
выбрасывается, когда нить тайм-аута и, таким образом, исполнитель отменил ее.
No. CancellationException
генерируется, если cancel()
метод Future
«ы вызывается до завершения задачи, и любой из его get()
методов впоследствии вызывается.
Но тогда, когда выбрано TimeoutException?
TimeoutException
(не CancellationException
) выбрасываются Future.get(long, Timeunit)
, если указанное количество времени проходит без задания завершающего.
есть ли случай, когда тайм-поток отключен и не отменен?
Да.Сроки - это совсем не то же самое, что отменяется.
Что касается обновления:
делает nayone еще называют Future.cancel()
если разработчик явно не делает?
Только тот, кто имеет ссылку на вопрос конкретного Future
может вызывать его метод cancel()
. ExecutorService
не вызывает его, если это то, что вы имеете в виду, и, в частности, таймаут отличается от отмены и, следовательно, не вызывает CancellationException
s.
javadoc ничего не говорит о CancellationException
, вызванных им.
Javadoc для Future.cancel()
не упоминает об этом, и я не вижу особой необходимости для того, чтобы сделать это. The exception's own class-level javadocs объясняет его значение и javadocs тех методов Future
, которые могут бросить ему документ, который они делают.
У меня есть код, входящий в систему, и мне, возможно, придется отменить этот код из-за определенного срока.
Так это звучит, как вы бы ссылаться на версию два-Arg из Future.get()
таким образом, чтобы ограничить время, а затем в случае тайм-аута (сигнализируется TimeoutException
) вы бы вызвать Future.cancel()
.
, но тогда, я должен быть в состоянии сказать, когда Future.cancel()
возвращается true
, он сделал это потому, что задача завершена или ее отмены. Из того, что кажется, Future.cancel()
возвращает true в обоих случаях.
Где вы? Документы из Future.cancel()
, которые вы сами ссылаются, говорят, что метод возвращает
false
, если задача не может быть отменена, как правило, потому что она уже завершена нормально; true
иначе
Таким образом, если Future.cancel()
возвращает true
, то вы можете быть уверены в том, что задача, конечный результат представлен Future
успешно был отменен, в том смысле, что ни один результат никогда не будет произведен, и что последующий вызов одного из его методов get()
выкинет CancellationException
. Если бы он еще не был запущен, это никогда не будет; если он был запущен, то он был прерван.
Последняя альтернатива требует прохождения true
до Future.cancel()
, и в этом случае задача, фактически прекращающая работу, зависит от ее реализации, когда этот ответ прерывается. Неясно, считается ли успешным выполнение задачи в процессе выполнения, если задача фактически не прекращается; это может фактически быть зависимым от реализации.
thx для получения полезного ответа. У меня больше позади этого Q-- не удалось все это сделать раньше. PLS см. мое обновление. –
@ ash__999, я обновил свой ответ, чтобы ответить на ваши дополнения к вопросу, но, пожалуйста, имейте в виду, что мы хмуримся за такие обновления вопросов здесь. Это не дискуссия - как только вы получите ответ на свой вопрос, любой последующий вопрос должен быть поставлен в качестве новых вопросов, предпочтительнее ссылаясь на оригинал. –