Page 172 - 6571
P. 172

}
                          } catch(InterruptedException e) {
                            // потік перерваний під час очікування
                          } finally {

                            виконати очистку, якщо необхідно;
                          }
                          // виходом з методу run() завершується виконання потоку
                        }

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

                  боку,  метод  isInterrupted()  може  бути  використаний  для
                  перевірки того, чи був перерваний будь-який потік. Його виклик
                  не призводить до зміни стану переривання.

                        Можна  знайти  велику  кількість  опублікованого  коду,  де  на
                  нижньому  рівні  переривання  типу  InterruptedException
                  ігнорується:

                        void myMethod() {
                          try {
                            sleep(delay);
                          } catch(InterruptedException e) { } // не ігнорувати!
                        }

                        Якщо нічого цікавого в блоці catch зробити не вдається, то

                  на вибір залишається наступних два обґрунтованих варіанта:
                        1. Зробити           в       блоці         catch           виклик          методу
                  Thread.currentThread().Interrupt(), щоб встановити стан

                  переривання  потоку  і  тоді  цей  стан  може  бути  перевірений  у
                  викликаючій частині програми:

                        void myMethod() {
                          try {
                            sleep(delay);
                          } catch (InterruptedException e) {
                            Thread.currentThread().Interrupt();
                          }
                        }

                        2. Прописати  throws InterruptedException  в  сигнатурі

                  методу  та  видалити  блок  try / catch,  і  тоді  дане  переривання
                  може бути  перехоплене у викликаючій частині програми (або в
                  крайньому випадку в методі run()):

                                                             171
   167   168   169   170   171   172   173   174   175   176   177