Описанный подход обладает одним недостатком. Поскольку в 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.