- •Методические указания по выполнению срс Программирование на языке java
- •Введение
- •1. Java - объектно-ориентированный язык программирования
- •1.1. Базовые типы данных
- •1.2. Операции (operators) в языке Java
- •1.2.1. Операции сравнения
- •1.2.2. Операции инкремента, декремента
- •1.3. Литералы (константы)
- •1.5. Массивы в Java
- •1.4. Операторы
- •1.6. Комментарии
- •1.7. Первая программа на языке Java
- •1.8. Цель, требования и рекомендации к выполнению задания
- •1.9. Задания
- •2. Абстрактные классы и Интерфейсы
- •2.1. Абстрактные классы
- •2.2. Интерфейсы
- •2.3. Цель, требования и рекомендации к выполнению задания
- •2.4. Задания
- •2.5. Пример выполнения задания.
- •3. Знакомство с библиотекой Swing
- •3.1. Основы оконной графики
- •3.2. Модель событий в Swing
- •3.3. Цель, требования и рекомендации к выполнению задания
- •3.4. Задания
- •3.5. Пример выполнения задания.
- •4. Апплеты
- •4.1. Проблема безопасности
- •4.2. Создание апплетов
- •4.3. Апплеты и приложения
- •4.4. Цель, требования и рекомендации к выполнению задания
- •4.5. Задания
- •4.6. Пример выполнения задания.
- •4.6.1. Запуск апплетов
- •4.6.2. Пример выполнения задания 2
- •5. Множественные нити выполнения (Multiple threads).
- •5.1. Реализация многопоточности в Java
- •5.1.1. Методы класса Thread
- •5.1.2. Реализация интерфейса Runnable
- •5.3. Завершение и останов нити
- •5.4. Приоритеты нитей
- •5.5. Средства синхронизации нитей в Java
- •5.6. Применение многопоточности для анимации
- •5.7. Цель, требования и рекомендации к выполнению задания
- •5.8. Задания
- •5.9. Пример выполнения задания.
- •Дополнительная информация и список литературы
- •Оглавление
5.5. Средства синхронизации нитей в Java
Проанализируем эту проблему с другой точки зрения. У нас есть некоторый ресурс, в данном случае - случайное число (переменная randValue), доступ к которому нужно упорядочить. Т.е. нужно заблокировать доступ к этому ресурсу для всех нитей, кроме одной, пока эта нить не выполнит над ним необходимые действия.
В Java есть возможности по синхронизации нитей, построенные на этом принципе. Т.е. определяется некоторый ресурс, который может быть заблокирован. Таким ресурсом может быть любой объект (но не данное элементарного типа). Далее определяются критические участки программы. При входе в такой участок, ресурс блокируется и становится недоступным для всех других нитей (с некоторой оговоркой, которую мы рассмотрим позже). При выходе из критического участка выполняется разблокировка ресурса.
В качестве критического участка программы в Java может быть определен некоторый нестатический метод или блок. При вызове метода блокируется объект, для которого вызван данный метод (this). Для блока блокируемый объект указывается явно. Синтаксис определения критических участков следующий. Для метода мы просто при описании метода указываем описатель synchronized, например,
public void synchronized f() {
...
}
Для блока мы непосредственно перед блоком ставим конструкцию synchronized (объект), где объект - это ссылка на блокируемый объект. Например,
synchronized(ref) {
...
}
Здесь в качестве критического участка определяется блок, а в качестве блокируемого объекта - объект, на который ссылается ref.
5.6. Применение многопоточности для анимации
Одно из наиболее распространенных применений апплетов - это создание анимационных эффектов типа бегущей строки, мерцающих огней или аналогичных, привлекающих внимание пользователя. Для того чтобы достичь такого эффекта, необходим какой либо механизм, позволяющий выполнять перерисовку всего окна апплета или его части периодически с заданным временным интервалом.
Работа апплетов, так же как и обычных приложений операционной системы Windows, основана на обработке событий. Для классического приложения Windows событие - это приход сообщения в функцию окна. Основной класс апплета обрабатывает события, переопределяя те или иные методы базового класса Applet.
Проблема с периодическим обновлением окна апплета возникает из-за того, что в языке Java не предусмотрено никакого механизма для создания генератора событий, способного вызывать какой-либо метод класса апплета с заданным интервалом времени. Вы не можете поступить так, как поступали в этой ситуации, разрабатывая обычные приложения Windows - создать таймер и организовать обработку периодически поступающих от него сообщений WM_TIMER.
Напомним, что перерисовка окна апплета выполняется методом paint, который вызывается виртуальной машиной Java асинхронно по отношению к выполнению другого кода апплета.
Можно ли воспользоваться методом paint для периодической перерисовки окна аплета, организовав в нем, например, бесконечный цикл с задержкой?
К сожалению, так поступать ни в коем случае нельзя. Метод paint после перерисовки окна апплета должен сразу возвратить управление, иначе работа апплета будет заблокирована.
Единственный выход из создавшейся ситуации - создание потока (или нескольких потоков), которые будут выполнять рисование в окне апплета асинхронно по отношению к работе кода апплета. Например, вы можете создать поток, который периодически обновляет окно апплета, вызывая для этого метод repaint, или рисовать из потока непосредственно в окне апплета, получив предварительно для этого окна контекст отображения.
