2011-03-17 2 views
1

Я часто сталкивалась с этим сниппет:Event Driven Thread

{ 

SwingUtilities.invokeLater(new Runnable() 
    { 
    public void run() { 
    new tester(); // class name 
    } 
}); 

} 

Я знаю, почему мы используем это, но не могу понять, как это going.I значит, я не понимаю этот фрагмент кода.

(Мы инициализируем объект по методе выполнения ,,, почему ??)

Пожалуйста, объясните это

ответ

3

С этим битом кода вы создаете Inner Class, реализующий Runnable, что экземпляр будет помещён в диспетчере задач обработки AWT для последующей обработки в потоке. Цитирование документации, invokeLater ...

Причина doRun.run() должен быть выполнено асинхронен по событию AWT диспетчерского нить. Это произойдет после того, как все ожидающие события AWT были обработаны .

Итак, в какой-то момент диспетчер AWT решит запустить этот экземпляр Runable в потоке. Это спровоцирует выполнение метода run и, следовательно, выполнение оператора new tester();, которые просто создают экземпляр класса tester.

К вашему конкретному вопросу ...

Мы инициализируем объект под запустить метод ,,, почему ??

Это действительно не кажется правильным, чтобы просто создать класс в методе run, если конструктор не делает много вещей, которые на самом деле плохая практика.

It'be гораздо более интуитивным, чтобы сделать что-то вроде:

SwingUtilities.invokeLater(new Runnable() 
    { 
    public void run() { 
    Tester t = new Tester(); 
    t.doSomeStuff(); 
    } 
}); 
+0

не может понять :( –

+1

Я бы сказал, что это нить, которая будет помещена в диспетчере задач обработки AWT ». То, что находится в очереди, не является нитями. Просто Runnable-объект, методы выполнения которого затем выполняются (AWT thread). – barjak

+0

@barjak nice point (+1). Я согласен с тобой, потоки запускают объект, а экземпляры Runable находятся в очереди. Я изменю эту формулировку. –

1

Это классический способ инъекционного код в выделенном потоке. AWT не является потокобезопасным (как и все инструменты для UI), и, следовательно, весь код, который имеет дело с AWT, должен выполняться в прикладном потоке (Threading Dispatch Thread, EDT).

Для этого у AWT есть очередь «кусок кода», который будет вызываться в EDT: EventQueue. EDT - это всего лишь цикл, который деактивирует следующий «кусок кода» для выполнения и запускает его. Эти «фрагменты кода» на самом деле всего лишь Runnable экземпляров. Это могут быть события пользовательского интерфейса (мышь, клавиатура) или код, который вы, как разработчик, даете ему.

Позвонив по номеру invokeLater, просто укажет EDT на экземпляр Runnable в его EventQueue. Выполненная вами очередь будет выполнена (или, точнее, ее метод run будет выполнен) в EDT, когда это будет его очередь.

Этот способ передачи кода из одного потока в другой очень распространен и полезен: это отличный способ сериализации фрагментов кода, которые поступают из разных потоков. Единственная вещь, которая должна быть потокобезопасной, - это сама очередь.

Смежные вопросы