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