Я уверен, что все эти подходы будут работать, но я был бы признателен за мнения о том, какой из них является лучшим.
Рассмотрим в качестве аргумента (неудачный) сценарий, в котором пользовательский интерфейс изменяет код и смешивает достаточно интенсивный (в среднем 500 мс) логический код и неразделим . все изменяющиеся компоненты пользовательского интерфейса находятся на одной панели.
01 new Thread(){
02 public void run(){
03
04 for (int i = 0; i < 100; i++){
05 // some processing
06 doSomething();
07 // update some ui components
08 panel.doSomeUi();
09 }
10
11 panel.revalidate();
12 panel.repaint();
13
14 }}.start();
Какой из следующих трех подходов вы бы выбрали и почему?
- обернуть весь код в invokeLater
- вызовите invokeLater внутри doSomeUi (), а затем снова для повторной проверки / перекраски
- использовать только invokeLater для повторной проверки / перекраски в конце
Для моего:
Опция 1 может повесить поток обработки событий (EPT), пока происходит вся обработка
опция 2 будет иметь дополнительные издержки при создании многих новых исполняемых модулей и в особых случаях может привести к тому, что пользовательский интерфейс обновится наполовину завершенным, если компонентам потребуется, чтобы некоторые из последующих изменений пользовательского интерфейса были действительными
вариант 3 будет наиболее эффективным, но может иметь некоторые проблемы с безопасностью потока
стремится услышать другие мнения.