Page 246 - 6253
P. 246

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

                        виконати очистку, якщо потрібно;
                     }

                     // виходом з методу run() завершується виконання потоку
                  }
                  Перевірка  стану  переривання  потоку  викликом  методу  isInterrupted()  не  є

            обов’язковою  і  не  зручна,  оскільки  можна  виконати  виклик  методу  sleep()  (або

            інший  метод  переривання)  після  кожної  ітерації  циклу.  Якщо  метод  sleep()

            викликається,  коли  встановлено  стан  переривання,  то  потік  не  переходить  у  стан

            очікування.  Замість  цього  він  очищає  свій  стан  і  генерує  виняток  типу

            InterruptedException.  Таким  чином,  якщо  метод  sleep()  викликається  в  циклі,  то

            перевіряти  стан  переривання  не  має  необхідності.  Замість  цього  краще  виконати

            перехоплення  згенерованого  об’єкта  винятку  типу  InterruptedException,  як  це

            показано нижче.

                  public void run() {

                     try {
                        while (додаткові дії) {
                           виконати додаткові дії;

                           Thread.sleep(delay);
                        }

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

                        виконати очистку, якщо необхідно;
                     }

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

            Більше  того,  виклик  даного  методу  призводить  до  очищення  стану  переривання

            потоку. З іншого боку, метод isInterrupted() може бути використаний для перевірки

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

            переривання.

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





                                                              245
   241   242   243   244   245   246   247   248   249   250   251