Когда приложение не использует потоки worker, его код выполняется как один линейный блок шагов, также называемый
потоком
выполнения. Поток выполняет код, написанный разработчиком. Кроме того, он выполняет большую часть кода, который является частью среды выполнения, в особенности кода, который обновляет экран, когда изменяются свойства экранных объектов. Хотя код записан порциями в виде методов и классов, при запуске код выполняется по одной строке так, как будто он написан в виде одной длинной последовательности шагов. Рассмотрим в качестве гипотетического примера эти действия, выполняемые приложением.
-
Вход в кадр: среда выполнения вызывает любые обработчики события
enterFrame
и по очереди выполняет их код.
-
Перемещение мыши: пользователь перемещает мышь, а среда выполнения вызывает обработчики событий мыши по мере того, как происходят различные события входа в область объекта и выхода из нее
-
Событие завершения загрузки: запрос на загрузку файла XML из URL возвращает данные загруженного файла. Вызывается обработчик события, который выполняет свои шаги, считывая содержимое XML и создавая набор объектов из данных XML.
-
Перемещение мыши: мышь снова перемещается, поэтому среда выполнения вызывает соответствующие обработчики событий мыши
-
Рендеринг: больше нет событий, ожидающих обработки, поэтому среда выполнения обновляет экран на основе изменений, внесенных в экранные объекты
-
Вход в кадр: цикл повторяется с начала
Как описано в примере, гипотетические шаги 1-5 выполняются последовательно в одном блоке времени, который называется кадром. Так как эти они выполняются последовательно одним потоком, среда выполнения не может прервать один шаг процесса для выполнения другого. При частоте 30 кадров в секунду среде выполнения отводится менее одной тридцатой доли секунды на выполнение всех этих операций. Во многих случаях этого времени достаточно для выполнения кода, и среда выполнения просто ждет до начала следующего кадра. Однако предположим, что данные XML, загружаемые на шаге 3, имеют обширную структуру с многочисленными вложенными уровнями. Поскольку код циклически обрабатывает XML и создает объекты, на это может уйти больше времени, чем одна тридцатая доля секунды. В этом случае последующие шаги (обработка перемещений мыши и перерисовка экрана) выполняются с задержкой. В результате этого экран зависает и «притормаживает», так как перерисовка в ответ на перемещение мыши происходит недостаточно быстро.
Если весь код выполняется в одном потоке, есть только один способ предотвращения таких случайных зависаний. Необходимо избегать длительных операций, таких как циклическая обработка большого набора данных. Потоки worker ActionScript обеспечивают другое решение проблемы. Можно использовать отдельный поток worker для выполнения длительного кода. Каждый поток worker выполняется в отдельном потоке, поэтому фоновый поток worker выполняет длительную операцию в собственном потоке. Это освобождает поток выполнения главного потока worker для перерисовки экрана при входе в каждый кадр: он не блокируется выполнением других шагов.
Такая возможность выполнять несколько операций кода одновременно называется
параллелизмом
. Когда фоновый поток worker завершает свою операцию или промежуточные выполнения операции, можно отправлять уведомления и данные главному потоку worker. Таким образом можно написать код, который выполняет сложные и длительные операции и вместе с тем предотвращает такое неприятное явление, как зависание экрана.
Потоки worker полезны тем, что уменьшают вероятность падения частоты кадров по причине блокирования главного потока рендеринга другим кодом. Однако использование потоков worker предъявляет дополнительные требования к системной памяти и мощности ЦП, что может оказать значительное влияние на общее быстродействие приложения. Так как каждый поток worker использует собственный экземпляр виртуальной машины среды выполнения, даже самый простой поток worker может значительно увеличить потребление ресурсов. При использовании потоков worker проверяйте код на всех целевых платформах, чтобы убедиться, что его требования к системе не слишком велики. Adobe рекомендует не использовать больше одного или двух фоновых потоков worker в обычных сценариях.