Java - разница между SwingWorker и SwingUtilities.invokeLater () - PullRequest
9 голосов
/ 13 мая 2010

SwingWorker используется для следующих целей:

  • Для запуска долгосрочных задач в другом потоке, чтобы предотвратить перехват GUI
  • Для обновления GUIс результатами, полученными в результате выполнения длительной задачи, в конце задачи с помощью метода done().
  • Для периодического обновления графического интерфейса пользователя с промежуточными результатами, полученными и опубликованными задачей с помощью *Методы 1010 * и process().

SwingUtilities.invokeLater() могут выполнять вышеуказанные задачи следующим образом:

  • Вместо выполнения метода SwingWorker.execute() из EDT, мы можемвыполнить ExecutorService.submit(new MyRunnable()), так как он также создаст другой поток, который может выполнять долгосрочную задачу.
  • Для обновления графического интерфейса пользователя в конце задачи мы можем поместить код (записанный в done() метод case1) SwingUtilites.invokeLater(new RunnableToExecuteDoneMethodCode()) в конце задачи.
  • Для обновления GUI в середине задачи мы можем поместить код (записанный в process() метод case1) SwingUtilites.invokeLater(new RunnableToExecuteProcessMethodCode()) в том месте, где мы вызвали publish() метод в case1.

Я задаю этот вопрос, потому что проблема, указанная в вопросе Java - SwingWorker - Можем ли мы вызвать один SwingWorker из другого SwingWorker вместо EDT , может быть решен с помощью SwingUtilities.invokeLater(), но не может бытьрешено с SwingWorker

Ответы [ 2 ]

6 голосов
/ 13 мая 2010

SwingWorker - это вспомогательный класс - вам не нужно его использовать, но использовать его гораздо проще и понятнее, чем выполнять ту же работу вручную. (Это также облегчает проверку прогресса.) Обратите внимание, что была добавлена ​​версия 6 - до этого некоторые люди использовали более простой класс, определенный в учебнике по Swing, или делали шаги, подобные тем, которые вы отметили.

1 голос
/ 16 мая 2014

Важной особенностью класса 1.6+ SwingWorker является различие EDT (Thread Dispatch Thread) между doInBackground () и done (). Вы должны думать о doInBackground () как doWorkOutsideEDT () и done () как doWorkInsideEDT (). Запустите этот учебный пример, чтобы увидеть другое.

    System.out.println("TID=" + Thread.currentThread().getId() + " (main)");
    final SwingWorker<String, String> x = new SwingWorker<String, String>() {
        @Override
        protected String doInBackground() throws Exception {
            final long tid = Thread.currentThread().getId();
            System.out.println("");
            System.out.println("TID=" + tid + " doInBackground() isEventDispatchThread=" + SwingUtilities.isEventDispatchThread());
            System.out.println("Long running code goes here.");
            return "";
        }

        @Override
        protected void done() {
            final long tid = Thread.currentThread().getId();
            System.out.println("");
            System.out.println("TID=" + tid + "          done() isEventDispatchThread=" + SwingUtilities.isEventDispatchThread());
            System.out.println("GUI updates/changes go here.");
        }
    };
    x.execute();
    x.get();

Выход:

TID=1 (main)

TID=9 doInBackground() isEventDispatchThread=false
Long running code goes here.

TID=16          done() isEventDispatchThread=true
GUI updates/changes go here.
...