Правильный способ запуска настольного приложения Java Swing - PullRequest
3 голосов
/ 18 июня 2011

Как правильно запустить приложение, которому требуется 5-10 секунд, чтобы получить исходные данные из базы данных? Это то, что я получил до сих пор, но я не уверен, что нет лучших способов. Мне бы хотелось, чтобы графический интерфейс и доступ к базе данных были бы в разных потоках, чтобы создание графического интерфейса происходило одновременно с извлечением данных.

public static void main(String[] args) {
    final Controller controller = new Controller();
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            View frame = new View();
            controller.setView(frame);
        }
    });
    Model model = new Model();
    controller.setModel(model);
    controller.getInitialData();
}

1 Ответ

8 голосов
/ 18 июня 2011

Вы на правильном пути. Надеюсь, это немного прояснит ситуацию ...

Swing не является потокобезопасным. Тем не менее, есть пара вещей, которые вы можете сделать. Один из вариантов - использовать SwingUtilities, чтобы опубликовать задачу Runnable в потоке диспетчеризации событий для выполнения. Это позволит вам получать данные из базы данных и обновлять пользовательский интерфейс в отдельном потоке, соблюдая однопоточную модель Swing.

SwingUtilities.invokeLater(new Runnable(){
    @Override
    public void run(){
        //  update UI
    } 
});

Другой вариант, поскольку это длительная задача, заключается в использовании SwingWorker для предоставления обновлений пользовательского интерфейса либо по завершении, либо во время обработки.

Как видите, оба эти механизма (т. Е. SwingUtilities и SwingWorker) позволяют вам назначать такие задачи другим потокам, в то же время предоставляя вам возможность поместить результат (который обычно переводится в действие) на EventQueue для последующего (и безопасного) исполнения. Независимо от того, какой из них вы выберете, важно помнить, что длительные задачи никогда не должны выполняться в EDT. И поэтому, как я обнаружил, наиболее важной особенностью любого хорошо спроектированного графического интерфейса является отзывчивость .

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