Page 170 - 6571
P. 170

18.3 Керування станом переривання потоків



                        Потік  переривається,  тоді  коли  його  метод  run()  повертає
                  керування,  виконавши  оператор  return  вслід  за  останнім
                  оператором  у  своєму  тілі,  або  у  випадку,  якщо  генерується
                  виняткова  ситуація,  яка  не  обробляється  в  даному  методі.  У

                  початковій версії Java також був присутній метод stop(), який
                  міг бути викликаний з іншого потоку, щоб перервати виконання

                  даного  потоку.  Проте  зараз  даний  метод  не  рекомендується  до
                  використання.
                        Метод  interrupt()  посилає  потоку  запит  на  переривання.
                  При  цьому  стан  переривання  потоку  встановлюється  рівним

                  значенню  true.  Якщо  потік  в  даний  момент  заблокований
                  викликом  методу  sleep(),  то  генерується  виняток  типу

                  InterruptedException.
                        Статичний  метод  interrupted()  перевіряє,  чи  був
                  перерваний  поточний  потік.  Його  виклик  має  певний  побічний
                  ефект,  що  проявляється  у  встановленні  стану  переривання

                  поточного потоку в логічне значення false.
                        Метод isInterrupted() перевіряє, чи був перерваний потік.

                  На  відміну  від  статичного  методу  interrupted(),  виклик
                  даного методу не змінює стан переривання потоку.
                        Можна  виконати  примусове  переривання  потоку,  але  метод

                  interrupt()викликатися                   тільки       для      запиту        на      його
                  переривання.  Коли  виконується  виклик  методу  interrupt()з
                  об’єкту потоку, то даний потік переводиться в стан переривання.

                  Для  того  щоб  з’ясувати,  чи  для  потоку  був  встановлений  стан
                  переривання,            необхідно          викликати           статичний           метод
                  Thread.currentThread(),  який  повертає  поточний  потік  і  з

                  нього  викликати  метод  isInterrupted(),  що  повертає  булеве
                  значення, яке характеризує стан в якому знаходиться потік:

                        while (!Thread.currentThread().isInterrupted()) {
                          виконати додаткові дії;
                        }

                        Але  якщо  потік  заблокований,  то  перевірити  стан  його
                  переривання не можливо, проте можна використати згенерований

                  виняток          типу        InterruptedException.                    Коли         метод
                  interrupt()  викликається  для  потоку,  що  був  заблокований,

                                                             169
   165   166   167   168   169   170   171   172   173   174   175