Java руководство для начинающих - Шилдт Герберт (2012)
-
Год:2012
-
Название:Java руководство для начинающих
-
Автор:
-
Жанр:
-
Оригинал:Английский
-
Язык:Русский
-
Издательство:Вильямс
-
Страниц:316
-
ISBN:978-5-8459-1770-6
-
Рейтинг:
-
Ваша оценка:
Java руководство для начинающих - Шилдт Герберт читать онлайн бесплатно полную версию книги
Для того чтобы стала понятнее потребность в применении методов wait () и notify () в многопоточном программировании, рассмотрим пример программы, имитирующей работу часов и выводящей на экран слова "Tick" (Тик) и "Тоск" (Так). Для этой цели создадим класс TickTock, который будет содержать два метода: tick () и tock (). Метод tick () выводит слово "Tick", а метод tock () — слово "Тоск". При запуске программы, имитирующей часы, создаются два потока: в одном из них вызывается метод tick (), а в другом — метод tock (). В результате взаимодействия двух потоков на экран будет выводиться набор повторяющихся сообщений "Tick Tock", т.е. после слова "Tick", обозначающего один такт, должно следовать слово "Тоск", обозначающее другой такт часов.
// Применение методов wait() и notifyO для имитации часов,
class TickTock {
String state; // содержит сведения о состоянии часов
synchronized void tick(boolean running) {
if (!running) { // остановить часы
state = "ticked";
notifyO; // уведомить ожидающие потоки
return;
}
System.out.print("Tick ");
state = "ticked"; // установить текущее состояние после такта "тик"
notify(); // Метод tick() уведомляет метод tock()
// о возможности продолжить выполнение.
try {
while(!state.equals("tocked") )
wait();// Метод tick() ожидает завершения метода tock().
}
catch(InterruptedException exc) {
System.out.println("Thread interrupted.");
}
}
synchronized void tock(boolean running) {
if(!running) { // остановить часы
state = "tocked";
notifyO; // уведомить ожидающие потоки
return;
}
System.out.println("Tock");
state = "tocked"; // установить текущее состояние после такта "так"
notifyO; // Метод tock() уведомляет метод tick()
// возможности продолжить выполнение.
try {
while(!state.equals("ticked") )
wait(); // Метод tock() ожидает завершения метода tick().
}
catch(InterruptedException exc) {
System.out.println("Thread interrupted.");
}
}
}
class MyThread implements Runnable {
Thread thrd;
TickTock ttOb;
// построить новый поток
MyThread.(String name, TickTock tt) {
thrd = new Thread(this, name);
ttOb = tt;
thrd.start(); // начать поток
}
// начать исполнение нового потока
public void run() {
if(thrd.getName().compareTo("Tick") == 0) {
for(int i=0; i<5; i++) ttOb.tick(true);
ttOb.tick(false);
}
else {
for(int i=0; i<5; i++) ttOb.tock(true);
ttOb.tock(false);
}
}
}
class ThreadCom {
public static void main(String args[]) {
TickTock tt = new TickTock();
MyThread mtl = new MyThread("Tick", tt);
MyThread mt2 = new MyThread("Tock", tt);
try {
mtl.thrd.join();
mt2.thrd.join();
} catch(InterruptedException exc) {
System.out.println("Main thread interrupted.");
}
}
}
В результате выполнения этой программы на экране появляются следующие сообщения:
Tick Tock
Tick Tock
Tick Tock
Tick Tock
Tick Tock
`