Составители:
Рубрика:
74
пустой метод run(). Thread сам по себе не выполня-
ет ничего.
11.3 Создание потока
Потоки исполнения в Java применяются очень широко. Вирту-
альная машина для исполнения загруженного в нее класса создает
несколько потоков, один из которых исполняет метод исполняет
метод public static void main(String[] args). По завершении
этого потока остальные потоки также завершаются.
Для того, чтобы организовать в своей программе еще один
поток исполнения, необходимо создать новый объект типа
Thread
и вызвать его метод start(). Но так как собственный метод
run()класса Thread пуст, то его (метод run()) требуется пере-
определить. Это можно сделать, описав класс-расширение класса
Thread – например, MyThread. Запуск нового потока состоится
при выполнении метода start():
MyThread t=new MyThread();
t.start();
Класс MyThread наследует все методы класса Thread, что
удобно при необходимости управления новым потоком.
11.4 Интерфейс Runnable
Однако наследование классу Thread исключает возможность насле-
дования другим классам, а это очень ограничивает сферу приложения
потоков исполнения. К счастью, когда расширение класса Thread не-
возможно из-за наследования другому классу, поток исполнения мо-
жет быть создан из объекта типа Runnable.
Runnable - это интерфейс с одним-единственным методом run().
Класс, имплементирующий его, обязан определить
этот метод. Что
гарантирует содержание потока исполнения, созданного из объекта
Runnable, полученного из объекта исходного класса. Этот подход, на
75
первый взгляд, менее понятен и более сложен, однако он позволяет
создавать потоки на основе классов, не способных к расширению
класса Thread. Например, класс MyComponent является расширением
класса java.awt.Component, так как имеет элементы, которые должны
отображаться графически. С другой стороны, некоторые свойства объ-
ектов этого класса меняются с течением времени и для отражения это
-
го изменения нужно создать поток исполнения, имеющий доступ ко
всем методам класса MyComponent. Сначала описываем класс
MyComponent:
class MyComponent extends java.awt.Component
implements Runnable{
. . . . . . . . . . . . . . . . . . . . . .
public void run(){/операторы/}
}
Потом используем объект этого класса как «фундамент» для нового
потока исполнения.
MyComponent m=new MyComponent();
Thread t=new Thread((Runnable) m);
t.start();
11.5 Метод start()
Если судить по описанию метода start( ) в документации, этот ме-
тод может показаться бесполезным:
void start( )
causes this thread to begin execution; the Java Virtual Machine
calls the run method of this thread.
Но метод run( ) можно вызвать и непосредственно. Однако, дело в
том, что JVM регистрирует потоки, и совершается это именно при
вызове метода start( ). Управлять незарегистрированным потоком
исполнения невозможно.
11.6 Методы управления потоками
К методам управления потоками можно отнести start(), sleep(),
join(), yield() и interrupt(). При этом прямое управляющее действие