Применение многопоточности
для анимации
Одно из наиболее распространенных применений
аплетов - это создание анимационных эффектов
типа бегущей строки, мерцающих огней или
аналогичных, привлекающих внимание
пользователя. Для того чтобы достичь такого
эффекта, необходим какой либо механизм,
позволяющий выполнять перерисовку всего окна
аплета или его части периодически с заданным
временным интервалом.
Работа аплетов, так же как и обычных приложений
операционной системы Windows, основана на обработке
событий. Для классического приложения Windows
событие - это приход сообщения в функцию окна.
Основной класс аплета обрабатывает события,
переопределяя те или иные методы базового класса
Applet.
Проблема с периодическим обновлением окна
аплета возникает из-за того, что в языке Java не
предусмотрено никакого механизма для создания
генератора событий, способного вызывать
какой-либо метод класса аплета с заданным
интервалом времени. Вы не можете поступить так,
как поступали в этой ситуации, разрабатывая
обычные приложения Windows - создать таймер и
организовать обработку периодически
поступающих от него сообщений WM_TIMER.
Напомним, что перерисовка окна аплета
выполняется методом paint, который вызывается
виртуальной машиной Java асинхронно по отношению к
выполнению другого кода аплета.
Можно ли воспользоваться методом paint для
периодической перерисовки окна аплета,
организовав в нем, например, бесконечный цикл с
задержкой?
К сожалению, так поступать ни в коем случае
нельзя. Метод paint после перерисовки окна аплета
должен сразу возвратить управление, иначе работа
аплета будет заблокирована.
Единственный выход из создавшейся ситуации -
создание потока (или нескльких потоков), которые
будут выполнять рисование в окне аплета
асинхронно по отношению к работе кода аплета.
Например, вы можете создать поток, который
периодически обновляет окно аплета, вызывая для
этого метод repaint, или рисовать из потока
непосредственно в окне аплета, получив
предварительно для этого окна контекст
отображения.