Довольно близко к правильной идее. Однако в вашем catch (InterruptedException)
должно быть:
Thread.currentThread().interrupt();
, чтобы прерванный статус снова включался и не выполнял работу во втором блоке.
Отредактируйте, чтобы прояснить мою точку зрения (потому что редактирование ОП, кажется, пропустило мою начальную точку :-P): вы должны написать свой код так:
try {
for (int = 40; i > 0; --i) {
updateGUI(i, label);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // <-- THIS LINE IS IMPORTANT
}
Второе редактирование, чтобы объяснить, что делает прерывание. : -)
Когда вы вызываете thread.interrupt()
, устанавливается флаг прерывания этого потока . Этот флаг ничего не делает сам по себе; это просто переменная. Причина этого заключается в том, что прерывание поддерживает то, что называется «совместное управление потоками», когда исполняемый код потока решает, что делать при прерывании (вместо того, чтобы принудительно завершать работу на месте).
Некоторые функции, встроенные в JDK, такие как Thread.sleep
, или Object.wait
, или Lock.lockInterruptibly
, будут проверять флаг, а если он установлен, то выдает InterruptedException
после снятия флажка.
Итак, если вы вызываете одну из этих функций, вам не нужно вручную проверять флаг прерывания. Но если вы этого не сделаете, например, если вы делаете интенсивную обработку вместо того, чтобы чего-то ждать, то вам следует периодически проверять флаг.
Есть два способа проверить флаг:
interrupted()
isInterrupted()
Первый очищает прерванный флаг; второй нет. Вы должны решить, какая версия является «более правильной» для логики вашего приложения.