| |
екстов
Рассмотрим поля и самые важные методы, определенные в классах приложения
Synchro.
Поля основного класса аплета
В основном классе аплета определены две ссылки m_DrawRectThread и
m_NotifyTaskThread:
DrawRectangles m_DrawRectThread = null;
NotifyTask m_NotifyTaskThread = null;
Первая из них является ссылкой на объект класса DrawRectangles, определенный
нами для задачи рисования прямоугольников. Вторая переменная представляет собой
ссылку на объект класса NotifyTask, который создан для задачи, управляющей
работой задачи рисования.
Метод start основного класса
Метод start создает и запускает на выполнение две задачи. Первая задача
создается как объект класса DrawRectangles, вторая - как объект класса
NotifyTask:
if (m_DrawRectThread == null)
{
m_DrawRectThread = new DrawRectangles(this);
m_DrawRectThread.start();
}
if (m_NotifyTaskThread == null)
{
m_NotifyTaskThread = new NotifyTask(m_DrawRectThread);
m_NotifyTaskThread.start();
}
При создании задачи рисования прямоугольников конструктору передается ссылка
на аплет. Эта ссылка нужна задаче для определения размеров окна аплета и
получения контекста отображения.
Конструктору класса NotifyTask передается ссылка на задачу, работой которой
она будет управлять с помощью механизма ожидания извещений.
Метод stop основного класса
Когда пользователь покидает страницу с аплетом, метод stop останавливает
работу обеих задач, вызывая для них метод stop из класса Thread:
if (m_DrawRectThread != null)
{
m_DrawRectThread.stop();
m_DrawRectThread = null;
}
if (m_NotifyTaskThread != null)
{
m_NotifyTaskThread.stop();
m_NotifyTaskThread = null;
}
Поля класса DrawRectangles
В поле g класса Graphics хранится контекст отображения окна аплета,
определенный конструктором класса DrawRectangles.
Поле dimAppWndDimension хранит размеры окна аплета.
Конструктор класса DrawRectangles
Для получения контекста отображения окна аплета, ссылка на который
передается через единственный параметр, конструктор класса DrawRectangles
вызывает метод getGraphics:
public DrawRectangles(Applet Appl)
{
g = Appl.getGraphics();
dimAppWndDimension = Appl.size();
}
Размеры окна аплета определяются с помощью метода size.
Метод run класса DrawRectangles
Метод run вызывает метод wait для синхронизации с другой задачей, поэтому
этот метод определен как синхронизированный с помощью ключевого слова
synchronized:
public synchronized void run()
{
. . .
}
Внутри метода run организован цикл рисования, который мы уже описывали.
После рисования очередного прямоугольника метод run переходит в состояние
ожидания извещения, вызывая метод wait:
try
{
Thread.wait();
}
catch (InterruptedException e)
{
}
Поля класса NotifyTask
В классе NotifyTask мы определили одно поле STask класса Thread, которое
хранит ссылку на задачу, работой которой управляет данный класс. Конструктор
класса NotifyTask записывает сюда ссылку на задачу рисования прямоугольников.
Метод run класса NotifyTask
Метод run класса NotifyTask периодически разблокирует задачу рисования
прямоугольников, вызывая для этого метод notify в цилке с задержкой 30
миллисекунд. Обращение к объекту STask, который хранит ссылку на задачу
рисования прямоугольников, выполняется с использованием синхронизации:
synchronized(STask)
{
STask.notify();
}
Задачи-дем
|
|