Как узнать, нахожусь ли я в потоке отправки событий?

1. Учтите, что мой код находится в какой-то строке JPanel, которая у меня есть, я автоматически перехожу на EDT?

2. Тот же вопрос для всех других классов, которые не принадлежат GUI, JPanels или другим классам представлений, простому логическому классу.

3. Если у меня есть JPanel, в котором я играю музыку, находясь в ней, должна ли музыка запускаться в потоке отправки событий или в другом потоке, который не является EDT (чтобы не блокировать графический интерфейс, хотя я не чувствовал никаких проблем с запуском это из EDT)?

Примечание. Мне нужно общее правило, как узнать это, не используя SwingUtilities.isEventDispatchThread()
Спасибо.


person JavaSa    schedule 22.10.2011    source источник
comment
Когда ничего не помогает, SwingUtilities класс имеет статический метод, который вы можете использовать: SwingUtilities.isEventDispatchThread()   -  person Hovercraft Full Of Eels    schedule 23.10.2011
comment
Да, я знаю, я забыл написать, что хочу общее правило, как это узнать, не используя SwingUtilities.isEventDispatchThread()   -  person JavaSa    schedule 23.10.2011
comment
@mKorbel задал этот вопрос со ссылкой на статью, в которой обобщаются несколько подходов к поиску EDT. нарушения.   -  person trashgod    schedule 23.10.2011
comment
почему вы не хотите использовать API, предназначенный для решения вашей проблемы? (что, как я предполагаю, защищает от нарушений правила EDT)   -  person kleopatra    schedule 23.10.2011
comment
@kleopatra: Кого из них вы имеете в виду?   -  person JavaSa    schedule 23.10.2011
comment
«какой из них» подразумевает варианты - я вижу только один метод, упомянутый в вашем вопросе ;-)   -  person kleopatra    schedule 24.10.2011


Ответы (2)


  1. No.
  2. No.
  3. Фоновая ветка.

Если код, работающий за пределами EDT, вызывает метод, определенный в классе GUI, этот код будет выполняться не в EDT, а в вызывающем потоке.

Если код, работающий в EDT, вызывает код, определенный в классе, отличном от GUI, этот код будет выполняться в EDT.

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

Методы, которые будут выполняться в EDT, являются слушателями событий, когда они вызываются Swing, а не вами. (Однако они все еще могут быть, если вы звоните им из EDT.)

Кроме того, любой код внутри метода Runnable.run() передается в SwingUtilities.invokeLater() и invokeAndWait() также запускается в EDT.

Любые обычные методы, которые вы вызываете из EDT, будут выполняться в EDT.

Любой код, вызываемый из Thread, который вы создаете (независимо от того, используете ли вы потоки напрямую, ExecutorService или SwingWorker.doInBackground()), нет в EDT. Метод main() вашей программы также нет в EDT.

person millimoose    schedule 22.10.2011
comment
Для всех других следующих читателей этого поста: также рекомендуется прочитать ответ Люка в следующем посте: stackoverflow.com/questions/7217013/ - person JavaSa; 23.10.2011
comment
Что-то все еще странно Когда я какой-то JPanel (EDT точно - я проверил с проверкой метода), а затем я вызываю какой-то поток анимации (поток расширения Thread), чтобы начать, внутри потока я не на EDT по проверке. Так что я думаю, что я должен быть, потому что анимация должна быть в EDT, поэтому я обернул метод анимации с помощью runnable и invokeAndWait(), но все равно получил, что в потоке анимации я не в EDT, при вызове этого кода, как я сказал ранее находится в EDT, так что мой вызов и ожидание, похоже, не помещает эту анимацию в EDT? это почему? - person JavaSa; 23.10.2011
comment
@JavaSa: опубликуйте это как отдельный вопрос, включая соответствующий код. Также добавьте комментарий со ссылкой на вопрос здесь. - person millimoose; 23.10.2011
comment
Спасибо, вот он stackoverflow.com/questions/7867960/animation-thread -и-ред - person JavaSa; 23.10.2011

Согласно моему комментарию: когда ничего не помогает, SwingUtilities класс имеет статический метод, который вы можете использовать: SwingUtilities.isEventDispatchThread()

Касаемо 3) Обязательно используйте фоновую ветку.

И насколько я знаю, нет никакого "общего правила". Да, код в вашем графическом интерфейсе должен быть в EDT, но если у вас где-то есть ошибка, ее может и не быть, хотя обычно она есть. То же самое для слушателей Swing.

person Hovercraft Full Of Eels    schedule 22.10.2011