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 вслід за останнім оператором у своєму тілі, або