Чтение онлайн

на главную - закладки

Жанры

Программирование на Java

Вязовик Н.А.

Шрифт:

Формула вычисления приоритетов позволяет равномерно распределить все допустимые значения для всех запускаемых потоков. На самом деле, константа минимального приоритета имеет значение 1, максимального 10, нормального 5. Так что в простых программах можно явно пользоваться этими величинами и указывать в качестве, например, пониженного приоритета значение 3.

Результатом работы будет:

Thread 0 started

Thread 1 started

Thread 2 started

Thread 2 counts 0

Thread 2 counts 1

Thread 2 counts 2

Thread 2 counts 3

Thread 2 counts 4

Thread 0 counts 0

Thread 1 counts 0

Thread 1 counts 1

Thread 1 counts 2

Thread 1 counts 3

Thread 1 counts 4

Thread 0 counts 1

Thread 0 counts 2

Thread 0 counts 3

Thread 0 counts 4

Потоки,

как и раньше, стартуют последовательно. Но затем мы видим, что чем выше приоритет, тем быстрее отрабатывает поток. Тем не менее, весьма показательно, что поток с минимальным приоритетом ( Thread 0 ) все же получил возможность выполнить одно действие раньше, чем отработал поток с более высоким приоритетом ( Thread 1 ). Это говорит о том, что приоритеты не делают систему однопоточной, выполняющей единовременно лишь один поток с наивысшим приоритетом. Напротив, приоритеты позволяют одновременно работать над несколькими задачами с учетом их важности.

Если увеличить параметры метода (выполнять 500000 вычислений, а не 50000, и выводить сообщение каждое 1000-е вычисление, а не 10000-е), то можно будет наглядно увидеть, что все три потока имеют возможность выполнять свои действия одновременно, просто более высокий приоритет позволяет выполнять их чаще.

Демон-потоки

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

Рассмотрим следующий пример:

public class ThreadTest implements Runnable {

// Отдельная группа, в которой будут

// находиться все потоки ThreadTest

public final static ThreadGroup GROUP = new ThreadGroup("Daemon demo");

// Стартовое значение, указывается при создании объекта

private int start;

public ThreadTest(int s) {

start = (s%2==0)? s: s+1;

new Thread(GROUP, this, "Thread "+ start).start;

}

public void run {

// Начинаем обратный отсчет

for (int i=start; i>0; i--) {

try {

Thread.sleep(300);

}

catch (InterruptedException e) {

}

// По достижении середины порождаем

// новый поток с половинным начальным

// значением

if (start>2 && i==start/2)

{

new ThreadTest(i);

}

}

}

public static void main(String s[]) {

new ThreadTest(16);

new DaemonDemo;

}

}

public class DaemonDemo extends Thread {

public DaemonDemo {

super("Daemon demo thread");

setDaemon(true);

start;

}

public void run {

Thread threads[]=new Thread[10]; while (true) {

//

Получаем набор всех потоков из

// тестовой группы

int count=ThreadTest.GROUP.activeCount;

if (threads.length<count) threads = new Thread[count+10]; count=ThreadTest.GROUP.enumerate(threads);

// Распечатываем имя каждого потока

for (int i=0; i<count; i++) {

System.out.print(threads[i].getName+", ");

}

System.out.println;

try {

Thread.sleep(300);

}

catch (InterruptedException e) {

}

}

}

}

Пример 12.1.

В этом примере происходит следующее. Потоки ThreadTest имеют некоторое стартовое значение, передаваемое им при создании. В методе run это значение последовательно уменьшается. При достижении половины от начальной величины порождается новый поток с вдвое меньшим начальным значением. По исчерпании счетчика поток останавливается. Метод main порождает первый поток со стартовым значением 16. В ходе программы будут дополнительно порождены потоки со значениями 8, 4, 2.

За этим процессом наблюдает демон -поток DaemonDemo. Этот поток регулярно получает список всех существующих потоков ThreadTest и распечатывает их имена для удобства наблюдения.

Результатом программы будет:

Thread 16,

Thread 16,

Thread 16,

Thread 16,

Thread 16,

Thread 16,

Thread 16,

Thread 16,

Thread 16,

Thread 16, Thread 8,

Thread 16, Thread 8,

Thread 16, Thread 8,

Thread 16, Thread 8,

Thread 16, Thread 8,

Thread 16, Thread 8, Thread 4,

Thread 16, Thread 8, Thread 4,

Thread 8, Thread 4,

Thread 4, Thread 2,

Thread 2,

Пример 12.2.

Несмотря на то, что демон -поток никогда не выходит из метода run, виртуальная машина прекращает работу, как только все не- демон -потоки завершаются.

В примере использовалось несколько дополнительных классов и методов, которые еще не были рассмотрены:

* класс ThreadGroup

Все потоки находятся в группах, представляемых экземплярами класса ThreadGroup. Группа указывается при создании потока. Если группа не была указана, то поток помещается в ту же группу, где находится поток, породивший его.

Методы activeCount и enumerate возвращают количество и полный список, соответственно, всех потоков в группе.

* sleep

Этот статический метод класса Thread приостанавливает выполнение текущего потока на указанное количество миллисекунд. Обратите внимание, что метод требует обработки исключения InterruptedException. Он связан с возможностью активизировать метод, который приостановил свою работу. Например, если поток занят выполнением метода sleep, то есть бездействует на протяжении указанного периода времени, его можно вывести из этого состояния, вызвав метод interrupt из другого потока выполнения. В результате метод sleep прервется исключением InterruptedException.

Поделиться:
Популярные книги

Наследие Маозари 7

Панежин Евгений
7. Наследие Маозари
Фантастика:
боевая фантастика
юмористическое фэнтези
постапокалипсис
рпг
фэнтези
эпическая фантастика
5.00
рейтинг книги
Наследие Маозари 7

Солдат Империи

Земляной Андрей Борисович
1. Страж
Фантастика:
попаданцы
альтернативная история
6.67
рейтинг книги
Солдат Империи

Наследие Маозари 4

Панежин Евгений
4. Наследие Маозари
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Наследие Маозари 4

Сборник коротких эротических рассказов

Коллектив авторов
Любовные романы:
эро литература
love action
7.25
рейтинг книги
Сборник коротких эротических рассказов

Кодекс Охотника. Книга XXXIV

Винокуров Юрий
34. Кодекс Охотника
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXXIV

Убивать чтобы жить 3

Бор Жорж
3. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 3

Войны Наследников

Тарс Элиан
9. Десять Принцев Российской Империи
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Войны Наследников

Черный Маг Императора 10

Герда Александр
10. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 10

Я еще не царь

Дрейк Сириус
25. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я еще не царь

Камень

Минин Станислав
1. Камень
Фантастика:
боевая фантастика
6.80
рейтинг книги
Камень

Я все еще князь. Книга XXI

Дрейк Сириус
21. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я все еще князь. Книга XXI

Кодекс Охотника XXVIII

Винокуров Юрий
28. Кодекс Охотника
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Кодекс Охотника XXVIII

Кадет Морозов

Шелег Дмитрий Витальевич
4. Живой лёд
Фантастика:
боевая фантастика
5.72
рейтинг книги
Кадет Морозов

Имя нам Легион. Том 1

Дорничев Дмитрий
1. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 1