Компьютерные книги
Главное меню
Главная Поиск по сайту Добавить материал О нас Карта книг Карта сайта
Реклама
computersbooks.net -> Добавить материал -> Языки программирования -> Бишоп Д. -> "Эффективная робота Java 2" -> 208

Эффективная робота Java 2 - Бишоп Д.

Бишоп Д. Эффективная робота Java 2 — Спб.: Питер, 2002. — 592 c.
ISBN 966-552-107-1
Скачать (прямая ссылка): effektivnayarabotajava2002.djvu
Предыдущая << 1 .. 202 203 204 205 206 207 < 208 > 209 210 211 212 213 214 .. 259 >> Следующая

....!¦¦¦'¦ ¦»¦¦ III ¦ І ««І ЦІМ 1111 »» «і»»»»»» nn'l'ir IHIimJlll ІІЧ.ИИИІИЧІІШІІИПІ • ¦• ИПІИІІИ1ІІЧІМІ1І . ... ...Ill ¦
wait [}; notify О; notifyAll () ;
Метод wait приостанавливает текущий подпроцесс, добавляя его в очередь, состоящую из подпроцессов, ожидающих своего шанса поработать с объектом.
Метод notify “пробуждает” первый подпроцесс очереди (notify — переводится, как у ее* домлятъ), ожидающий возможности поработать с объектом.
Метод notif уА11 “пробуждает” все подпроцессы очереди.
Теоретически все ожидающие подпроцессы в конце концов должны быть уведомлены, что могут выполнить свою работу. На практике это зависит от внимательности программиста и от того, учел ли он все возможные комбинации. Вполне возможно создание такой программы, в которой не будут создаваться определенные условия и возникнет ситуация, когда подпроцесс 1 будет ждать подпроцесс 2, который ждет подпроцесс I. Такое состояние называется зависанием или тупиковой ситуацией (deadlock) Java может обнаружить некоторые логические ошибки, особенно если методы wait и notify используются с несинхронизированными методами. В этом случае система создаст объект-исключение IllegalMonitorStateException.
__ р
В конце данной главы, в разделе '"Практикум 9”, показано, как подпроцессы различных видов могут стартовать во время выполнения и синхронизироваться для достижения конечной цели.
13.4. Класс Display
Класс Display неоднократно использовался в наших программах. Теперь мы наконец узнаем, из чего он состоит. Не имея никаких дополнительных подпроцессов, он использует методы класса Thr ead для осуществления мониторинга кнопки Готово. Вначале мы рассмотрим структуру класса Display, а затем используемые внутри него технологии.
474
Главо )3. Работа с несколькими подпроцессами
Структура класса Display
Класс Display, текст которого занимает 220 строк, состоит из восьми открытых методов (некоторые из них являются перегружаемыми), трех закрытых методов и двух поддерживающих классов. Закрытые методы перечислены ниже.
¦ Метод initializeDisplay — осуществляет GUI-инициализацию окна, со? іет панели (возможно, с полосами прокрутки), текстовые поля для ввода, тексте ую область для вывода, а также кнопки Готово и Закрыть.
¦ Метод getEntry — выполняет работу, общую для трех открытых методов с г..
¦ Метод insert Prompt — также выполняет работу, общую для трех перегружаемых
МеТОДОВ prompt.
Таблица вводимых значений
Значения, которые вводятся через GUI класса Display, содержатся в хеш-таблице, как показано на рис, 6.16. Таблица имеет интересную структуру. Как уже 6r.i о сказано, ключ — это строка, которая может быть довольно длинной (например, “Имя на бирке”). Значения — это объекты класса
private class Data {
TextField field;
String value;
)
Как только посредством метода prompt запрашивается новое пате ввода, о., создается и добавляется в область ввода. Ссылка на это поле формирует час" , вводимой записи в таблице. Вторая часть представляет собой значение, кот с зо е передается методу prompt. Заметьте, что мы сохраняем значение как строку. Это делает операцию ввода в текстовом поле более наглядной для пользователя. Есл . мь. должны сохранять числа, то столкнемся с необходимостью назначить для них формат, который должен быть удобным для всех пользователей.
Довольно интересен метод get Entry. Он используется методами getlnt, get-Doutole и getstring для того, чтобы проверить, является ли передаваемая метка действительной, и получить копию текущих данных из таблицы. Вот как выглядит метод с одним из таких "get":
private Data getEntry (String s) { if (table,containsKey(s)} return (Data) table.get(s); else {
outDisplay¦append(”\пОшибха: такая метка не была введена: f,+s+,r\nn} ; return null;
}
public int getlnt (String s) {
Data d = getEntry(s);
return Integer.valueOf(d.value}.intValue();
%
}
Заметьте, что сообщение об ошибке посылается в область вывода, что удобно для пользователя.
Класс Display
475
Когда происходит обновление таблицы? Заметим, что нажатие клавиши [Enter] после произведенных изменений в иоле данных вовсе не является необходимым. Однако нажатие на кнопку Готово срабатывает как главное инициирующее событие (такое же по важности, как и нажатие клавиши [Enter]), и именно на этом событии “лежит ответственность” за сканирование области ввода. Метод ready (инициируется при нажатии кнопки Готово) включает в себя цикл
// Копирует все значения иэ всех текстовых полей в таблицу, for (Enumeration е = table, keys О; е , hasMoreElements () ;) {
String паше — (String) е.nextElement(>;
Data d = (Data) table.get(name); d,value = d.field.getText (); table.put(паше, d) ;
}
Имея в таблице сохраненные ссылки на каждое текстовое поле, мы можем легко считать значения из GUL
Наблюдатель за кнопкой Тотово*
Предыдущая << 1 .. 202 203 204 205 206 207 < 208 > 209 210 211 212 213 214 .. 259 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Вирт Н. "Систематическое программирование " (Теория программирования)

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

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

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

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