Page 244 - 6253
P. 244

System.out.println("Головний потік: " + i);
                              Thread.sleep(1000);
                           }

                        } catch (InterruptedException e) {
                           System.out.println("Головний потік перерваний");

                           System.out.println("Головний потік завершений");
                        }
                     }

                  }
                  Дана програма генерує точно такий же результат, як і попередня версія. Проте,

            в даному випадку дочірній потік створюється за допомогою об’єкта класу MyThread,

            який є нащадком класу Thread.

                  Логічним буде запитання, чому Java пропонує два способи створення дочірніх

            потоків  і  який  із  них  кращий.  Клас  Thread  визначає  декілька  методів,  які  можуть

            бути  перевизначені  в  похідних  класах.  З  цих  методів  тільки  один  повинен  бути

            перевизначений в обов’язковому порядку – це метод run(). Цей же метод потрібно

            реалізувати використовуючи інтерфейс Runnable. Більшість розробників вважають,

            що  класи  слід  розширювати  тільки  у  тих  випадках,  коли  вони  мають  бути

            вдосконалені  або  певним  чином  модифіковані.  Тому,  якщо  перевизначати  інші

            методи  класу  Thread  не  має  необхідності,  то  рекомендується  все-таки  реалізувати

            інтерфейс Runnable. Крім того, при реалізації інтерфейсу Runnable клас потоку не

            повинен наслідувати клас Thread, що дає змогу наслідувати інші класи.



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


                  Потік переривається, тоді коли його метод run() повертає керування, виконавши

            оператор  return  вслід  за  останнім  оператором  у  своєму  тілі,  або  у  випадку,  якщо

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

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

            потоку,  щоб  перервати  виконання  даного  потоку.  Проте  зараз  даний  метод  не

            рекомендується до використання.

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

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

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




                                                              243
   239   240   241   242   243   244   245   246   247   248   249