2013-05-10 14 views
1

Это в основном теоретический вопрос. Пример ниже - это то, что заставило меня задуматься над этим, но это не лучший пример. Пожалуйста, предположите, что причина ниже конкретна, и на данный момент ее нельзя обойти.Могу ли я запустить два EDT?

В программе, которую я запускал, есть дополнительный кадр Debug, который создается при запуске программы, и он становится видимым пользователем, нажимая кнопки/сочетание клавиш.

Моя проблема заключается в том, что, поскольку у меня есть длительные процессы на EDT, если она висит по какой-либо причине или неудачно, я хотел бы сразу увидеть, и не дожидаться завершения этой нити, чтобы обновить журнал отладки Рамка.

Моим решением было бы иметь два отдельных EDT для двух отдельных графических интерфейсов, которые обновляются отдельным потоком.

Возможно ли это, или я не могу это сделать? Я не нашел ни одного онлайн-ресурса, который покажет мне, как это сделать. Я знаю, что EDT должны быть однопоточными, но если я оставлю потоки распущенными, могу ли я иметь два? Пожалуйста?

+0

простой ответ нет. – Ankit

+0

@ ay89 :(любая работа вокруг? – Pureferret

+0

долгий процесс в EDT, почему бы вам это сделать? Любая операция без GUI должна быть вне EDT, и никакая задача GUI не повесила бы EDT в идеале. – Ankit

ответ

4

Ответ прост: нет, вы не можете иметь 2 EDTs, это невозможно. Но вы не застряли в замороженном графическом интерфейсе, у вас есть некоторые варианты.

Прежде всего, два важных правила:

  1. Никогда делать длительные вычисления в EDT. Когда-либо.
  2. Никогда Управление компонентами Swing снаружи EDT. Когда-либо.

Нарушение первого правила приведет к тому, что ваш графический интерфейс будет заморожен и в течение этого времени не будет обработано никаких событий. Это включает обновления GUI, которые вы хотите сделать во время вычислений, которые не появятся до тех пор, пока не будут выполнены расчеты.

Последний часто игнорируется, который будет проходить незаметно большую часть времени, но он может - и будет - укусить вас в попку, а затем большую часть времени это огромная лаваша, чтобы вернуться и исправить. Так что сделайте это с самого начала. Что может случиться? Компоненты могут внезапно отображаться в сломанном состоянии, они могут казаться белыми, или все приложение может замерзнуть, поскольку между EDT и другими потоками существует тупиковая ситуация (там было сделано). Придерживайтесь Oracle Swing Threading Policy!


Итак, как избежать длительных вычислений на EDT после того, как пользователь нажал кнопку? Варианты:

  • использование SwingWorker. Преимущество: имеет метод done(), который вы можете использовать, который автоматически выполняется в EDT после завершения работника. Также реализует интерфейс Future и поэтому может использоваться для возврата результата.
  • вы можете просто создать свой собственный Runnable и выполнить вычисления там.
  • любым другим способом Java обеспечивает параллельное выполнение.

Ok, и как избежать когда-либо манипулирует GUI снаружи EDT?

  • позвонить SwingUtilities.invokeLater() и выполнить манипуляции с Swing.
  • использовать метод SwingWorkers done(), как описано выше.

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

+0

'Так что сделайте это с самого начала.« Если бы я был здесь, когда программа была впервые написана. – Pureferret

+1

@Pureferret Хорошо, если вам поручено исправить уже существующую программу с тоннами графического интерфейса, я бы сказал, сосредоточиться на получении длинных сегментов кода из EDT. Это должно быть управляемо. Попытка исправить правило №2 в существующей большой программе часто практически невозможна. – Marco

+0

Как написана программа ВСЕ, находится в EDT. Мне нужно пройти долгий путь. – Pureferret