2

Предположим, у меня есть Runnable экземпляр:Что происходит под Future.cancel (истинной)

class MyTask implements Runnable { 

    public void run() { 
    //some heavy calculation which takes time 
     Thread.sleep(5000) 
    //rest code 
    ... 
    } 

} 

Затем я использую ExecutorService представить вышеуказанную задачу:

ExecutorService service = Executors.newFixedThreadPool(3); 
Future<?> task = service.submit(new MyTask()); 

Теперь я могу отмените задание на task.cancel(true);. Я понял, что task.cancel(true) прервет рабочий поток, в котором работает эта задача, например Thread.currentThread().interrupt(). Но этот устанавливает только флаг, чтобы сообщить, что рабочий поток прерван.

Мой вопрос: если MyTask Runnable начал работать, как на самом деле future.cancel(true) останавливает мой код в run() продолжает выполнение кода останова? Существует ли периодическая проверка для прерываемого флага рабочей нити? Я имею в виду, что я не понимаю, как код в run() можно отменить, только установите прерванный флаг в true.

+2

'Future.cancel' будем называть' Thread.interrupt() '. В общем случае этот вызов не гарантирует прекратить поток от его собственного бизнеса. Это по той же причине 'Thread.stop()' и другие небезопасные методы устарели (см. Javadoc для объяснения). Вам решать организовать «Runnables», чтобы они могли своевременно обнаружить прерывистый статус. –

ответ

0

Future.cancel не что ваш рабочий код перестанет выполняться. То, что он делает, это установить прерванный флаг и вызвать блокировку JDK-вызовов для вызова InterruptedException. Ваш рабочий код может выбрать повторное прерванное прерывание и периодически проверять прерванный флаг, и в этом случае механизм отмены будет работать. В противном случае вы можете проглотить InterruptedException и игнорировать флаг iterrupted, и в этом случае механизм отмены ничего не сделает, но установите для отмененного флажка значение true.

См http://www.ibm.com/developerworks/library/j-jtp05236/

+1

Я думаю, что shoule будет «Future.cancel НЕ гарантирует ...» !? – isnot2bad

+0

Спасибо, исправлено – Maxaon3000

0

Существует метод с именем isInterrupted(), который сообщает текущему коду в потоке, что он прерывается возвратом true/false.

Обычно это проверяется методами, такими как wait, sleep, которые вы могли бы вызвать в потоке. Если вы не используете эти методы, вам придется вручную проверить этот метод [isInterrupted()], чтобы определить, прервал ли кто-то ваш поток.

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

+0

@ MJSG, чтобы быть более понятным для меня, вы имеете в виду в таких методах, как sleep(), wait() и т. Д., Под ними они вызывают isInterrupted(), чтобы проверить, прерван ли текущий поток? И если это правда, они просто ломаются, верно? – user842225

+0

Они бросают InterruptedException, если обнаруживают, что они были прерваны. –

+1

@ user842225 См. Http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html и http://stackoverflow.com/questions/3590000/what-does-java-lang-thread-interrupt- do – isnot2bad