Page 169 - 6571
P. 169
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, що дає змогу наслідувати інші класи.
168