2016-06-15 4 views
0

У меня есть тяжелый проект java, который не реагирует на пользователей. Я узнал, что долгое время необходимые события в потоке отправки событий могут привести к тому, что мой проект будет работать медленно. Итак, у меня есть два вопроса таким образом:Как отслеживать очередь событий Dispatch?

  1. Как я могу отслеживать поток отправки событий и видеть, какие события находятся в очереди, и в конечном итоге, какие из них тратят больше времени в потоке отправки событий? (Как вы знаете, функция invokeLater вставляет событие в конец очереди отправки событий. Я хочу отслеживать всю очередь отправки событий)
  2. Как я могу вставить событие в первый поток потока сообщений? (в этом случае GUI будет реагировать).
+1

Долгосрочные задачи НЕ должны выполняться на EDT. Это нормальная проблема для плохого ответа. Прочтите раздел из учебника Swing по [Concurrency] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html) для получения дополнительной информации. Проверьте «SwingWorker» из учебника. – camickr

+0

Я знаю это, и я уже прочитал учебник. Я хочу указать, какие события нужно долгое время. Итак, я хочу отслеживать очередь потоков отправки событий. – hamed

+1

Что вы хотите сделать, это не решит проблему «отзывчивой программы». Следуйте совету @camickr - вот как мы *** на самом деле *** решаем проблему. Голосование закрывается. –

ответ

-1

Вам необходимо предоставить более подробную информацию ... но сами потоки не имеют очередей. Вы не можете проверить, какая работа ждет в потоке, вы можете только проверить статус любого потока (например, в пуле потоков).

Если у вас есть концепция «работы», которая должна быть поставлена ​​в очередь для последующей обработки данным «рабочим» (т.е. потоком), вы должны реализовать это самостоятельно. В качестве альтернативы вы можете использовать актерскую систему, такую ​​как AKKA, которая звучит так, как будто она будет делать то, что вам нужно

+1

* «Вам нужно предоставить более подробную информацию». * На самом деле это не так. Проблема источника и исправления проблемы очевидна. –

1

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

Replace the Event Dispatch Queue с реализацией, которая контролирует, как долго события в очереди обрабатываются.

Когда событие занимает слишком много времени, новая реализация очереди регистрирует стек из EDT.
Если вы используете только для поиска стеков, когда выбрасываются исключения, не беспокойтесь. Новая реализация не убивает медленные события или заставляет их бросать исключения, а просто показывает вам, что делает EDT в момент обнаружения безответственности. Посмотрите на напечатанные стекы и выясните, как перемещать медленную часть события в другой поток.

Я считаю, что детектор медленности Netbean реализует нечто очень похожее.

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