Поток событий - PullRequest
       4

Поток событий

1 голос
/ 17 марта 2011

Я часто сталкивался с этим фрагментом:

{

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

}

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

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

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

Ответы [ 2 ]

3 голосов
/ 17 марта 2011

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

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

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

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

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

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

Было бы гораздо более интуитивно делать что-то вроде:

SwingUtilities.invokeLater(new Runnable()
   {
   public void run() {
     Tester t = new Tester();
     t.doSomeStuff();
   }
 });
1 голос
/ 17 марта 2011

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

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

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

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

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