Статус нашего сайта: |
ICQ Information Center |
ICQ SHOP 5-значные 6-значные 7-значные 8-значные 9-значные Rippers List ОПЛАТА СТАТЬИ СЕКРЕТЫ HELP CENTER OWNED LIST РОЗЫСК!New! ICQ РЕЛИЗЫ Протоколы ICQ LOL ;-) Настройка компьютера Аватарки Смайлики СОФТ Mail Checkers Bruteforces ICQTeam Soft 8thWonder Soft Other Progs ICQ Patches Miranda ICQ ФорумАрхив! ВАШ АККАУНТ ICQ LiveJournal
РекламаНаш канал:irc.icqinfo.ru |
Таненбаум Э.- Архитектура компьютера. стр.359Функция next позволяет увеличивать значения in и out, при этом не нужно каждый раз писать код, чтобы проверять условие окончания цикла. Если параметр в next равен 98 или ниже, то возвращается следующее по порядку целое число. Если параметр равен 99, это значит, что мы достигли конца буфера, поэтому возвращается 0. Если какой-то из процессов не может продолжаться, желательно иметь способ временно его приостановить. Зная об этой потребности, разработчики первой версии Java включили в класс Thread специальные методы suspend (приостановка) и resume (возобновление работы). Они используются в листинге 6.1. А теперь рассмотрим сам код производителя и потребителя. Сначала производитель генерирует новое число (оператор Р1). Обратите внимание на идентификатор m.MAXPRIME. Префикс m здесь указывает, что имеется в виду идентификатор MAXPRIME, определенный в классе т. По той же причине этот префикс нужен для идентификаторов in, out, buffer и next. Затем (оператор Р2) производитель проверяет, не меньше ли in значения out. Если да (например, in = 62 и out = 63), это означает, что буфер заполнен, и производитель вызывает метод suspend. Если буфер не заполнен, туда помещается новое число (оператор РЗ), и значение in инкрементируется (оператор Р4). Если при проверке в операторе Р5 обнаруживается, что новое значение in на 1 больше, чем out (например, in = 17, out = 16), это означает, что значения in и out перед увеличением in были равны. Тогда производитель делает вывод, что буфер был пуст, потребитель не функционировал (был приостановлен) и продолжает простаивать. Поэтому производитель вызывает метод resume, чтобы заставить потребителя возобновить работу (оператор Р5). После этого производитель начинает формировать следующее число. Программа потребителя по структуре очень проста. Сначала проверяется, пуст ли буфер (оператор С1). Если пуст, то потребителю ничего не нужно делать, поэтому он отключается. Если буфер не пуст, то потребитель извлекает из него следующее число для печати (оператор С2) и инкрементирует значение out (оператор СЗ). Если после этого значение out становится на 2 единицы больше in (оператор С4), это означает, что на предыдущем шаге значение out было на единицу меньше in. Так как условием заполнения буфера как раз и является значение in = out - 1, это означает, что производитель был приостановлен, и потребитель вызывает для производителя метод resume. После этого число выводится на печать (оператор С5), и весь цикл повторяется. К сожалению, программа содержит ошибку (рис. 6.23). Напомним, что наши два процесса работают асинхронно, то есть с разными скоростями, которые, к тому же, могут меняться. Рассмотрим случай, когда в буфере остается только одно число в элементе 21, и in = 22, a out = 21 (рис. 6.23, а). Производитель в операторе Р1 ищет число, а потребитель в операторе С5 печатает число с позиции 20. Потребитель заканчивает печатать число, совершает проверку в операторе С1 и извлекает последнее число из буфера в операторе С2. Затем он инкрементиру-ет значение out. В этот момент и in, и out равны 22. Потребитель печатает число, а затем переходит к оператору СІ, в котором он вызывает значения in и out из памяти, чтобы сравнить их (рис. 6.23, б). |