Компьютерные книги
Главное меню
Главная Поиск по сайту Добавить материал О нас Карта книг Карта сайта
Реклама
computersbooks.net -> Добавить материал -> Языки программирования -> Карабин П. -> "Язык программирования Java- Создание интерактивных приложений для Internet " -> 30

Язык программирования Java- Создание интерактивных приложений для Internet - Карабин П.

Карабин П. Язык программирования Java- Создание интерактивных приложений для Internet — М.: Бук Пресс, 2006. — 112 c.
ISBN 5-8321-0143-9
Скачать (прямая ссылка): yazikprogramirovnajava2006.pdf
Предыдущая << 1 .. 24 25 26 27 28 29 < 30 > 31 32 33 34 .. 35 >> Следующая

System, out. println(''Put: " + n);
} }
class Producer implements Runnable { Q q;
Producer(Q q) { this.q = q;
new Thread (this, ''Producer”). start ();
}
public void run() { int i = 0; while (true) { q.put(i++);
} } }
class Consumer implements Runnable {
186
Q q;
Consumer(Q q) { this.q = q;
new Thread(this, "Consumer").start();
}
public void run() { while (true) { q?get();
}
} }
class PC {
public static void main(String args[ ]) {
Q q = new Q();
new Producer(q);
new Consumer(q);
} }
Хотя методы put и get класса Q синхронизованы, в нашем примере нет ничего, что бы могло помешать поставщику переписывать данные по того, как их получит потребитель, и наоборот, потребителю ничего не мешает многократно считывать одни и те же данные. Так что вывод программы содержит вовсе не ту последовательность сообщений, которую нам бы хотелось иметь:
187
С:\>
Put
Got
Got
Got
Got
Got
Put
Put
Put
Put
Put
Put
Got
ava PC
Как видите, после того, как поставщик помещает в переменную п значение 1, потребитель начинает работать и извлекает это значение 5 раз подряд. Положение можно исправить, если поставщик будет при занесении нового значения устанавливать флаг, например, заносить в логическую переменную значение true, после чего будет в цикле проверять ее значение до тех пор пока поставщик не обработает данные и не сбросит флаг в false.
188
Правильным путем для получения того же результата в Java является использование вызовов wait и notify для передачи сигналов в обоих направлениях. Внутри метода get мы ждем (вызов wait), пока Producer не известит нас (notify), что для нас готова очередная порция данных. После того, как мы обработаем эти данные в методе get, мы извещаем объект класса Producer (снова вызов notify) о том, что он может передавать следующую порцию данных. Соответственно, внутри метода put, мы ждем (wait), пока Consumer не обработает данные, затем мы передаем новые данные и извещаем (notify) об этом объект-потребитель. Ниже приведен переписанный указанным образом класс Q.
class Q { int n;
boolean valueSet = false; synchronized int get() { if (!valueSet) try wait();
catch(InterruptedException e):
System, out. printlnC'Got: " + n);
valueSet = false; notifyO; return n;
}
189
synchronized void put(int n) { if (valueSet) try wait();
cateh(InterruptedException e); this.n = n; valueSet = true;
System.out.println(”Put: " + n);
notifyO;
} }
А вот и результат работы этой программы, ясно показывающий, что синхронизация достигнута.
С:\> java Pcsynch
Put: 1
Got: 1
Put: 2
Got: 2
Put: 3
Got: 3
Put: 4
Got: 4
Put: 5
Got: 5
190
Клинч (deadlock)
Клинч — редкая, но очень трудноуловимая ошибка, при которой между двумя легковесными процессами существует кольцевая зависимость от пары синхронизированных объектов. Например, если один подпроцесс получает управление объектом X, а другой — объектом У, после чего X пытается вызвать любой синхронизированный метод Y, этот вызов, естественно блокируется. Если при этом и Y попытается вызвать синхронизированный метод X, то программа с такой структурой подпроцессов окажется заблокированной навсегда. В самом деле, ведь для того, чтобы один из подпроцессов захватил нужный ему объект, ему нужно снять свою блокировку, чтобы второй подпроцесс мог завершить работу.
Сводка функций программного интерфейса легковесных процессов
Методы класса
Методы класса — это статические методы, которые можно вызывать непосредственно с именем класса Thread.
191
currentThread
Статический метод currentThread возвращает объект Thread, выполняющийся в данный момент.
yield
Вызов метода yield приводит к тому, что исполняющая система переключает контекст с текущего на следующий доступный подпроцесс. Это один из способов гарантировать, что низкоприоритетные подпроцессы когда-нибудь получат управление.
sleep(int п)
При вызове метода sleep исполняющая система блокирует текущий подпроцесс на п миллисекунд. После того, как этот интервал времени закончится, подпроцесс снова будет способен выполняться. В большинстве исполняющих систем Java системные часы не позволяют точно выдерживать паузы короче, чем 10 миллисекунд.
Методы объекта
start
Метод start говорит исполняющей системе Java, что необходимо создать системный контекст подпроцесса и запустить этот подпроцесс. После вызова этого метода в новом контексте будет вызван метод run вновь созданного подпроцесса.
192
Вам нужно помнить о том, что метод start с данным объектом можно вызвать только один раз.
run
Метод run — это тело выполняющегося подпроцесса.
Это — единственный метод интерфейса Runnable. Он вызывается из метода start после того, как исполняющая среда выполнит необходимые операции по инициализации нового подпроцесса. Если происходит возврат из метода run, текущий подпроцесс останавливается.
stop
Вызов метода stop приводит к немедленной остановке подпроцесса.
Это — способ мгновенно прекратить выполнение текущего подпроцесса, особенно если метод выполняется в текущем подпроцессе. В таком случае строка, следующая за вызовом метода stop, никогда не выполняется, поскольку контекст подпроцесса «умирает» до того, как метод stop возвратит управление. Более аккуратный способ остановить выполнение подпроцесса — установить значение какой-либо переменной-флага, предусмотрев в методе run код, который, проверив состояние флага, завершил бы выполнение подпроцесса.
Предыдущая << 1 .. 24 25 26 27 28 29 < 30 > 31 32 33 34 .. 35 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Вирт Н. "Систематическое программирование " (Теория программирования)

Эком "Microsoft Excel 2000 шаг за шагом Русская версия самоучитель " (Самоучитель)

Поляков А.Ю. "Методы и алгоритмы компьютерной графики в примерах Vizual C++" (Графика)

Баяковский Ю.М. "Графическая библиотека Open GL " (Графика)

Валиков А. "Технология " (Языки программирования)
Авторские права © 2013 ComputersBooks. Все права защищены.