Java руководство для начинающих - Шилдт Герберт (2012)
-
Год:2012
-
Название:Java руководство для начинающих
-
Автор:
-
Жанр:
-
Оригинал:Английский
-
Язык:Русский
-
Издательство:Вильямс
-
Страниц:316
-
ISBN:978-5-8459-1770-6
-
Рейтинг:
-
Ваша оценка:
Java руководство для начинающих - Шилдт Герберт читать онлайн бесплатно полную версию книги
Ниже приведен пример программы, демонстрирующий использование двух потоков с разными приоритетами. Потоки создаются как экземпляры класса Priority. В методе run () содержится цикл, отсчитывающий число своих шагов. Этот цикл завершает работу, когда значение счетчика достигает 10000000 или же когда статическая переменная stop принимает логическое значение true. Первоначально переменной stop присваивается логическое значение false, но первый же поток, заканчивающий отсчет, устанавливает в ней логическое значение true. В результате второй поток завершится, как только ему будет выделен квант времени. В цикле производится проверка символьной строки в переменной currentName на совпадение с именем исполняемого потока. Если они не совпадают, это означает, что произошло переключение задач. При этом отображается имя нового потока, которое присваивается переменной currentName. Это дает возможность следить за тем, насколько часто каждый поток получает время ЦП. После остановки обоих потоков выводится число шагов, выполненных в каждом цикле.
// Демонстрация потоков с разными приоритетами.
class Priority implements Runnable {
int count;
Thread thrd;
static boolean stop = false;
static String currentName;
/* Построение нового потока. Обратите внимание на то,
что конструктор не запускает поток на исполнение. */
Priority(String name) {
thrd = new Thread(this, name);
count = 0;
currentName = name;
}
// начать исполнение нового потока
public void run() {
System.out.println(thrd.getName() + " starting.");
do {
count++;
if(currentName.compareTo(thrd.getName()) != 0) {
currentName = thrd.getName();
System.out.println("In " + currentName);
}
// Первый же поток, в котором достигнуто значение 10000000,
// завершает остальные потоки.
} while(stop == false && count < 10000000);
stop = true;
System.out.println("\n" + thrd.getName() +
" terminating.");
}
}
class PriorityDemo {
public static void main(String args[]) {
Priority mtl = new Priority("High Priority");
Priority mt2 = new Priority("Low Priority");
// задать приоритеты
// Поток mtl получает более высокий приоритет, чем поток mt2.
mtl.thrd.setPriority(Thread.NORM_PRIORITY+2);
mt2.thrd.setPriority(Thread.NORM_PRIORITY-2);
// запустить потоки на исполнение
mtl.thrd.start();
mt2.thrd.start();
try {
mtl.thrd.join();
mt2.thrd.join();
}
catch(InterruptedException exc) {
System.out.println("Main thread interrupted.");
}
System.out.println("\nHigh priority thread counted to " +
mtl.count);
System.out.println("Low priority thread counted to " +
mt2.count);
}
}
Результат выполнения данной программы выглядит следующим образом:
High Priority starting.
In High Priority
Low Priority starting.
In Low Priority
In High Priority
High Priority terminating.
Low Priority terminating.
High priority thread counted to 10000000
Low priority thread counted to 8183
В данном примере большую часть времени ЦП получает высокоприоритетный поток. Очевидно, что результат выполнения программы существенно зависит от быстродействия ЦП и их количества, типа операционной системы и наличия прочих задач, выполняющихся в системе.
Синхронизация