2016-12-19 2 views
-2

Согласно Javadoc, Future.get(), throwsи CancellationException вместе с 2 другими.Разница между `TimeoutException` и` CancellationException`

В чем разница между TimeoutException и CancellationException?

Из того, что я знаю, CancellationException выбрасывается, когда нить тайм-аута и, таким образом, исполнитель отменил ее. Но тогда когда TimeoutException бросили? Есть ли случай, когда timed-thread timed-out и не отменена?

saw CancellationException when using ExecutorService и What is the best way to handle an ExecutionException? Другие другие.

TIA.

// ---------------

UPDATE

делает nayone еще называют Future.cancel() если разработчик явно не делает?

javadoc ничего не говорит о CancellationException, вызванных им.

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

ответ

1

CancellationException бросается, когда задача отменяется, вызывая cancel().

TimeoutException выбрасывается, когда вы спрашиваете get(), чтобы подождать определенное время для результата, а результат займет больше времени, чтобы его создать.

Нить не время. И исполнитель не отменяет потоки.

2

Из того, что я знаю, 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(), и в этом случае задача, фактически прекращающая работу, зависит от ее реализации, когда этот ответ прерывается. Неясно, считается ли успешным выполнение задачи в процессе выполнения, если задача фактически не прекращается; это может фактически быть зависимым от реализации.

+0

thx для получения полезного ответа. У меня больше позади этого Q-- не удалось все это сделать раньше. PLS см. мое обновление. –

+0

@ ash__999, я обновил свой ответ, чтобы ответить на ваши дополнения к вопросу, но, пожалуйста, имейте в виду, что мы хмуримся за такие обновления вопросов здесь. Это не дискуссия - как только вы получите ответ на свой вопрос, любой последующий вопрос должен быть поставлен в качестве новых вопросов, предпочтительнее ссылаясь на оригинал. –

0

Из того, что я знаю, CancellationException выбрасывается при истечении нити и, таким образом, исполнитель отменил его.

Нет, не совсем. Если поток A вызывает future.get(), а другой поток B вызывает future.cancel(), то future.get() throws CancellationException для потока A. Исключение пытается указать потоку A, что задание, которое оно ожидало, было отменено.

Но тогда, когда есть TimeoutException брошен? есть ли случай, когда тайм-поток тайм-аут и не отменен?

Нет. Если поток А вызывает future.get(long, TimeUnit), метод генерирует TimeoutException по истечении заданного времени ожидания. Это не означает, что выполняемое задание вышло из строя только для того, чтобы поток A, ожидавший завершения задания, был исчерпан. Будущее, скорее всего, все еще работает.

ли кто-либо еще звонит Future.cancel(), если разработчик явно не делает?

Это очень зависит от ситуации. Это немного необычно для кого-то другого, кроме темы, которая запустила задания, чтобы позвонить future.cancel(...), но, конечно же, не неслыханно.

У меня есть код, входящий в систему, и мне, возможно, придется отменить этот код из-за определенного срока. но тогда, я должен быть в состоянии сказать, когда Future.cancel() возвращает true, он сделал это, потому что задача завершена или она отменена.

future.cancel(...) возвращает true, если задание было отменено. Цитировать из javadocs:

Возвращает: false, если задача не может быть отменена, как правило, потому что она уже завершена нормально; true в противном случае

Так что, если оно возвращает true, то работа успешно отменена. Вы можете убедиться, позвонив по телефону future.get(), после чего он должен бросить CancellationException.

Также очень важно понять, что потоки не могут быть легко отменены, если они уже запущены. Даже если вы вызываете future.cancel(true), это только прерывает поток, который не останавливает его немедленно. Это вызовет Thread.sleep(...) и другие методы, которые бросают InterruptedException, но обычно вам приходится писать код, чтобы подчиняться флагом прерывания. Что-то вроде:

// keep running until we are interrupted 
while (!Thread.currentThread.isInterrupted()) { 
    ... 
} 
Смежные вопросы