Это классический способ инъекционного код в выделенном потоке. AWT не является потокобезопасным (как и все инструменты для UI), и, следовательно, весь код, который имеет дело с AWT, должен выполняться в прикладном потоке (Threading Dispatch Thread, EDT).
Для этого у AWT есть очередь «кусок кода», который будет вызываться в EDT: EventQueue. EDT - это всего лишь цикл, который деактивирует следующий «кусок кода» для выполнения и запускает его. Эти «фрагменты кода» на самом деле всего лишь Runnable
экземпляров. Это могут быть события пользовательского интерфейса (мышь, клавиатура) или код, который вы, как разработчик, даете ему.
Позвонив по номеру invokeLater
, просто укажет EDT на экземпляр Runnable
в его EventQueue
. Выполненная вами очередь будет выполнена (или, точнее, ее метод run
будет выполнен) в EDT, когда это будет его очередь.
Этот способ передачи кода из одного потока в другой очень распространен и полезен: это отличный способ сериализации фрагментов кода, которые поступают из разных потоков. Единственная вещь, которая должна быть потокобезопасной, - это сама очередь.
не может понять :( –
Я бы сказал, что это нить, которая будет помещена в диспетчере задач обработки AWT ». То, что находится в очереди, не является нитями. Просто Runnable-объект, методы выполнения которого затем выполняются (AWT thread). – barjak
@barjak nice point (+1). Я согласен с тобой, потоки запускают объект, а экземпляры Runable находятся в очереди. Я изменю эту формулировку. –