![]() |
![]() |
Потоки (Threads), Слушатели(Listeners) и События (Events)
|
Потоки(Threads), Слушатели (Listeners) и События (Events)
Потоки JavaКогда Java-программа запускается, возникает единственный работающий поток – основной поток (main thread). Мнонгие из классов leJOS запускают дополнительные потоки для различных целей, например:
Программа пользователя может создать свои собственные потоки путём наследования класса Thread, и затем, используя метод start запустить поток. В leJOS NXJ 0.7 и более поздних, потоки могут быть созданы из любого класса, который реализует интерфейс Runnable. Фоновые потоки (background threads), которые не нужно завершать для того, чтоб завершить программу пользвателя, должны быть помечены как демоны путём вызова setDaemon(true). При использовании потоков, необходимо быть внимательным, чтоб не столкнуться с проблемами, связанными с многопоточностью (concurrency issues). Когда происходит обращение к данным со стороны нескольких потоков, необходимо использовать синхронизацию, чтоб гарантировать, что данные не прочитаются в тот момент, когда они находятся в некорректном состоянии. leJOS NXJ поддерживает стандартные механизмы синхронизации Java: синхронизированные методы и ключевое слово "synchronized" использующее мониторные объекты (не уверен за точность перевода этого предложения, в оригинале оно выглядело так: leJOS NXJ supports the standard Java synchronization mechanisms: synchronized methods and synchronized statements using a monitor object). Чтоб увидеть пример потока leJOS, посмотрите на поток Indicators в leJOS StartUpText menu. Он используется для того, чтоб показывать уровень заряда батареи актуальным. Он читает значение каждую секунду и показывает его, когда меню загружает файлы или осуществляет связь с PC.
Метод main запускает этот поток так:
Слушатели (Listeners) и События (Events)leJOS реализует потоки слушателей которые слушают определённые события. Потоки слушателей поддерживают:
Button listeners используются чтоб обнаружить нажатие кнопки, что бы программа ни делала в это время. Чтоб ожидать нажатия какой-то конкретной кнопки, вы должны зарегистрироваться как listener этой button. Пример:
|