Page 133 - 4868
P. 133
131 Ошибка! Стиль не определен.
public static void main(String[] args) {
Thread thread = new Thread(new MyThread(),
"Демонстраційний потік");
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("Головний потік завершений");
}
}
}
В результаті виклику методу start(), відбувається запуск потоку.
Метод run() запускає цикл for дочірнього потоку. Після виклику методу
start() конструктор MyThread() повертає керування методу main(). Коли
головний потік продовжує свою роботу, він входить у власний цикл for.
Після цього обидва потоки виконуються паралельно, спільно
використовуючи ресурси процесора, аж до завершення своїх циклів.
Як уже згадувалося раніше, в багатопотоковій програмі головний потік
часто повинен завершувати виконання останнім. У деяких старих
віртуальних машинах Java (JVM), якщо головний потік завершується до
завершення дочірніх потоків, то у програмі може відбутися збій. Попередня
програма гарантує, що головний потік завершиться останнім, оскільки
головний потік «спить» 1000 мілісекунд між ітераціями циклу, а дочірній
потік – тільки 500 мілісекунд. Це змушує дочірній потік завершитися
швидше за головний.
Розширення класу Thread. Ще один спосіб створення потоку – це
оголосити клас, який розширює клас Thread, а потім створити екземпляр
даного класу. Дочірній клас зобов’язаний перевизначити метод run(), який є
точкою входу для нового потоку. Він також повинен викликати метод
start() для запуску виконання нового потоку. У лістингу 2.5 наведено
приклад попередньої програми, переписаної з використанням розширення
класу Thread.
Лістинг 2.5 – Створення потоку шляхом розширення класу Thread
class MyThread extends Thread {
// точка входу власного потоку
public void run() {
try {
for (int i = 5; i > 0; i--) {