Page 136 - 4868
P. 136

Ошибка! Стиль не определен.                                                              134

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

                     Перевірка        стану       переривання         потоку       викликом         методу
               isInterrupted() не є обов’язковою і не зручна, оскільки можна виконати
               виклик методу sleep() (або інший метод переривання) після кожної ітерації
               циклу.  Якщо  метод  sleep()  викликається,  коли  встановлено  стан
               переривання,  то  потік  не  переходить  у  стан  очікування.  Замість  цього  він
               очищає  свій  стан  і  генерує  виняток  типу  InterruptedException.  Таким
               чином,  якщо  метод  sleep()  викликається  в  циклі,  то  перевіряти  стан
               переривання  не  має  необхідності.  Замість  цього  краще  виконати
               перехоплення згенерованого об’єкта винятку типу InterruptedException,
               як це показано нижче.

                     public void run() {
                       try {
                         while (додаткові дії) {
                           виконати додаткові дії;
                           Thread.sleep(delay);
                         }
                       } catch(InterruptedException e) {
                         // потік перерваний під час очікування
                       } finally {
                         виконати очистку, якщо необхідно;
                       }
                       // виходом з методу run() завершується виконання потоку
                     }
                     Статичний  метод  interrupted()  перевіряє,  чи  був  перерваний
               поточний потік. Більше того, виклик даного методу призводить до очищення
               стану  переривання  потоку.  З  іншого  боку,  метод  isInterrupted()  може
               бути використаний для перевірки того, чи був перерваний будь-який потік.
               Його виклик не призводить до зміни стану переривання.
                     Можна  знайти  велику  кількість  опублікованого  коду,  де  на  нижньому

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

                     Якщо  нічого  цікавого  в  блоці  catch  зробити  не  вдається,  то  на  вибір
               залишається наступних два обґрунтованих варіанта:
                     1. Зробити           в         блоці         catch            виклик           методу
               Thread.currentThread().Interrupt(),                        щоб       встановити         стан
               переривання  потоку  і  тоді  цей  стан  може  бути  перевірений  у  викликаючій
   131   132   133   134   135   136   137   138   139   140   141