Читайте также:
|
|
С помощью метода join вы можете выполнять ожидание завершения работы потока, для которой этот метод вызван.
Существует три определения метода join:
public final void join();public final void join(long millis);public final void join(long millis, int nanos);Первый из них выполняет ожидание без ограничения во времени, для второго ожидание будет прервано принудительно через millis миллисекунд, а для третьего - через millis миллисекунд и nanos наносекунд. Учтите, что реально вы не сможете указывать время с точностью до наносекунд, так как дискретность системного таймера компьютера намного больше.
Описание проекта
Класс Sharing1
Класс самого приложения (апплета в данном случае, т.к. он расширяет класс JApplet).
Свойства
accessCount - счётчик доступов. Содержит количество обращений потокам с целью проверки равенства свойств count1 и count2 для выявления рассинхронизации.
isApplet – признак, что приложение является апплетом. Есть нюансы реализации в зависимости от этого, но в данном примере оно запускается не как апплет (в методе main устанавливается в false)
numCounters – количество объектов класса TwoCounter (по сути, количество работающих процессов)
numWatches – количество наблюдающих процессов.
S – массив процессов (объектов класса TwoCounter)
Методы
increment Access – увеличивает счётчик доступов и отображает его значение в соответствующем поле.
Класс TwoCounter
Наследует классу Thread, реализует пример процесса. В GUI содержит два текстовых поля для вывода значений свойств count1 и count2 и лейбл для отображения, равны ли они между собой или нет (при рассинхронизации потоков там появляется надпись “ Unsynched” – выводится в методе synchTest.
Свойства
started - признак, запущен ли процесс
count1, count2 – два счётчика, для иллюстрации многопоточности и синхронизации. Прикладного смысла не несут.
Методы
start – запускает поток. Вызывает метод старт родителя (суперкласса, т.е. Thread)
run – содержит действия, которые будут выполняться каждым запущенным потоком. Именно этот метод надо переопределить, чтобы указать, что же должен делать поток. В нём бесконечный цикл, в котором происходит увеличение счётчиков и блокировка потока (приостановка его действия) на 500 миллисекунд. Sleep обрамляется в try catch для обработки ситуации, когда поток аварийно завершится. В этом случае в консоль будет выведено сообщение.
synchTest – проверка синхронизации. По сути выполняется проверка, равны ли счётчики - count1 и count2. По идее, должны быть равны, но существует вероятность, что нет. Из-за того, что не разрулена синхронизация потоков. Точнее это будет в случае, если при выполнении sleep у TwoCounter будет выполнено run у Watcher.
init – инициализирует программу. Если приложение запущено как апплет (а в примере это НЕ так), то значения свойств numCounters и numWatchers определяются из переданных при загрузке страницы параметров. Если нет - то всё свойства получают значения по умолчанию.
Даале создаются процессы TwoCounter, создаётся GUI (панели, лейауты, назначение кнопкам листенеров и т.д.)
main – создаётся экземпляр класса Sharing1, указывается, что это не апплет, определяются свойства numCounters и numWatchers (если при запуске были указаны параметры, то из параметров, иначе 12 и 15 соответственно). Далее запускается GUI (статический метод run класса Console).
Дата добавления: 2014-12-19; просмотров: 36 | Поможем написать вашу работу | Нарушение авторских прав |