Page 134 - 4868
P. 134

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

                             System.out.println("Дочірній потік:" + i);
                             Thread.sleep(500);
                           }
                         } catch (InterruptedException e) {
                           System.out.println("Дочірній потік перерваний");
                         }
                         System.out.println("Дочірній потік завершений");
                       }
                     }
                     public class Main {
                       public static void main(String[] args) {
                         MyThread thread = new MyThread();
                         thread.setName("Демонстраційний потік");
                         System.out.println("Дочірній потік створено:" + thread);
                         // запуск потоку
                         thread.start();
                         try {
                           for (int i = 5; i > 0; i--) {
                             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, що дає змогу наслідувати інші класи.


                     18.3. Керування станом переривання потоків
                     Потік  переривається,  тоді  коли  його  метод  run()  повертає  керування,
               виконавши оператор return вслід за останнім оператором у своєму тілі, або
   129   130   131   132   133   134   135   136   137   138   139