Page 132 - 4868
P. 132
Ошибка! Стиль не определен. 130
звернутися до нематеріального стану виконуваного потоку, то робота із
потоком відбувається через його заступника (proxy), тобто екземпляр класу
Thread, який його породив. Щоб створити новий потік, програма повинна
або реалізувати інтерфейс Runnable, або розширити клас Thread.
Реалізація інтерфейсу Runnable. Найпростіший спосіб створення
потоку – це оголошення класу, що реалізує інтерфейс Runnable. Інтерфейс
Runnable абстрагує одиницю виконуваного коду. Створити новий потік
можна на снові будь-якого класу, що реалізує інтерфейс Runnable. Для
цього клас повинен перевизначити єдиний метод run(), що визначений в
інтерфейсі Runnable.
Всередину методу run() потрібно помістити код, який має бути
виконаний в новому потоці. При цьому з методу run() можуть викликатися
інші методи, використовуватися об’єкти інших класів та оголошуватися
змінні точно так само, як це відбувається в головному потоці. Єдиною його
відмінністю є те, що метод run() встановлює точку входу для іншого,
паралельного потоку всередині програми. Даний потік завершується, коли
метод run() повертає керування основній програмі.
Після того як створений клас, що реалізує інтерфейс Runnable,
необхідно створити об’єкт типу Thread. У класі Thread визначено декілька
конструкторів, один з яких приймає на вхід об’єкт класу, що реалізує
інтерфейс Runnable. Також у вигляді другого аргументу в даний
конструктор можна передати ім’я створюваного потоку.
Після того як новий потік буде створений, для його запуску потрібно
викликати метод start(), оголошений в класі Thread. По суті, метод
start() виконує виклик методу run().
Розглянемо приклад, що створює новий потік і запускає його на
виконання (лістинг 2.4).
Лістинг 2.4 – Створення власного потоку шляхом імплементації
інтерфейсу Runnable
class MyThread implements Runnable {
// точка входу власного потоку
public void run() {
try {
for (int i = 5; i > 0; i--) {
System.out.println("Дочірній потік:" + i);
Thread.sleep(500);
}
} catch (InterruptedException e) {
System.out.println("Дочірній потік перерваний");
}
System.out.println("Дочірній потік завершений");
}
}
public class Main {