Использование интерфейса Runnable
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Описанный подход обладает одним недостатком. Поскольку в Java отсутствует множественное наследование, требование наследоваться от Thread может привести к конфликту. Если еще раз посмотреть на приведенный выше пример, то станет понято, что наследование производилось только с целью переопределения метода run(). Поэтому предлагается более простой способ создать свой поток исполнения. Достаточно реализовать интерфейс Runnable, в котором объявлен только один метод - уже знакомый void run(). Запишем пример, приведенный выше, с помощью этого интерфейса:

Объявление:

public class <Имя класса> implements Runnable {

public void run() {

// Действия, выполняемые потоком

}

}

Запуск:

Runnable r = new <Имя класса>();

Thread t = new Thread(r);

t.start();

Подчеркнем, что Runnable не является полной заменой классу Thread, поскольку создание и запуск самого потока исполнения возможно только через метод Thread.start().

Управление потоками

void start ()
Запускает выполнение потока

void stop ()
Прекращает выполнение потока

void suspend ()
Приостанавливает выполнение потока

void resume ()
Возобновляет выполнение потока

static void sleep (long millis)
Останавливает выполнение потока как минимум на millis миллисекунд

static void yield()
Приостанавливает выполнение потока, предоставляет возможность выполнять другие потоки

void join ()
Ожидает завершения указанного потока








Группы потоков (ThreadGroup)

Каждый поток находится в группе. Группа указывается при создании потока. Если группа не была указана, то поток помещается в ту же группу, где находится поток, породивший его. Группы потоков образуют дерево, корнем служит начальная группа. Поток не имеет доступа к информации о родительской группе. Изменение параметров и состояния группы влияет на все входящие в нее потоки.

Создание группы:

//Без явного указания родительской группы

ThreadGroup group1 = new ThreadGroup("Group1");

//С явным указанием родительской группы

ThreadGroup group2 = new ThreadGroup(group1,  "Group2");

Создание потока:

//Без явного указания группы

MyThread t = new MyThread("Thread1");

//С явным указанием группы

MyThread t = new MyThread(group2, "Thread2");

Операции в группе потоков

 int activeCount ()
Возвращает приблизительное количество действующих (активных) потоков группы, включая и те потоки, которые принадлежат вложенным группам. Количество нельзя считать точным, т.к. в момент выполнения метода оно может измениться – одни потоки «умирают», другие – создаются.

int enumerate ( Thread [] list )
Заполняет массив list ссылками на объекты активных потоков группы и возвращает количество сохраненных ссылок. Также учитываются потоки, относящиеся ко всем вложенным группам.

int activeGroupCount ()
Возвращает количество групп, включая вложенные.

int enumerate ( ThreadGroup [] list)
Заполняет массив list ссылками на объекты вложенных групп потоков.

void interrupt ()
Прерывает выполнение всех потоков в группе






Приоритеты потоков

Приоритет – количественный показатель важности потока. Недетерминированно воздействует на системную политику упорядочивания потоков. Базовый алгоритм не должен зависеть от схемы расстановки приоритетов потоков. В Java потокам можно назначать приоритеты. Для этого в классе Thread существуют методы getPriority() и setPriority(), а также объявлены три

Константы
static int MAX_PRIORITY
static int MIN_PRIORITY
static int NORM_PRIORITY

Их значения описывают максимальное, минимальное и нормальное (по умолчанию) значения приоритета.

Методы потока
final int getPriority () – возвращает ранее заданное значение приоритета выполнения для текущего потока.
final void setPriority ( int newPriority )
– устанавливает приоритет выполнения для текущего потока.

Методы группы потоков
final int getMaxPriority () – возвращает ранее заданное значение верхней границы приоритетов выполнения для текущей группы потоков.
final void setMaxPriority ( int maxPri ) –
устанавливает верхнюю границу приоритетов выполнения для текущей группы потоков.








Демон-потоки (Daemons)

Демон-потоки позволяют описывать фоновые процессы, которые нужны только для обслуживания основных потоков выполнения и не могут существовать без них. Уничтожаются виртуальной машиной, если в группе не осталось не-демон потоков.

void setDaemon (boolean on) - устанавливает вид потока. Вызывается до запуска потока.

boolean isDaemon () - возвращает вид потока:
true – демон, false – обычный.


Демон-группы потоков

Демон-группа автоматически уничтожаются при останове последнего ее потока или уничтожении последней подгруппы потоков.

void setDaemon (boolean on) - устанавливает вид группы.

boolean isDaemon () - возвращает вид группы:
true – демон, false – обычная.


Дата: 2019-02-19, просмотров: 260.