Page 171 - 6571
P. 171

наприклад,  викликом  методу  sleep(),  то  генерується  об’єкт
            виняткової ситуації типу InterruptedException.
                  У  мові  Java  не  існує  вимоги,  що  перерваний  потік  повинен

            припинити  виконання.  Перерваний  потік  може  сам  вирішувати,
            як  реагувати  на  переривання.  Деякі  потоки  є  настільки
            важливими, що повинні виконати  обробку виняткової ситуації і

            продовжити  своє  виконання.  Але  найчастіше  потік  повинен
            інтерпретувати  переривання  як  запит  на  припинення  свого
            виконання.  Метод  run()  такого  потоку  може  мати  наступний
            вигляд:

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

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

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

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

            переходить у стан очікування. Замість цього він очищає свій стан
            і  генерує  виняток  типу  InterruptedException.  Таким  чином,
            якщо  метод  sleep()  викликається  в  циклі,  то  перевіряти  стан

            переривання не має необхідності. Замість цього краще виконати
            перехоплення              згенерованого            об’єкта         винятку           типу
            InterruptedException, як це показано нижче.

                  public void run() {
                    try {
                      while (додаткові дії) {
                        виконати додаткові дії;
                        Thread.sleep(delay);


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