Java - SwingWorker和SwingUtilities.invokeLater()之间的区别

时间:2010-05-13 18:41:36

标签: java swingworker swingutilities

SwingWorker用于以下目的:

  • 用于在不同的线程中运行长时间运行的任务,以防止GUI无响应
  • 使用done()方法在任务结束时使用长时间运行的任务生成的结果更新GUI。
  • 用于在publish()process()方法的帮助下,由任务生成和发布的中间结果,不时更新GUI。

SwingUtilities.invokeLater()可以按如下方式执行上述任务:

  • 我们可以执行SwingWorker.execute()而不是从EDT执行ExecutorService.submit(new MyRunnable())方法,因为它还会创建另一个可以执行长时间运行任务的线程。
  • 为了在任务结束时更新GUI,我们可以在任务结束时放置代码(用case {1}}方法编写)done()
  • 为了在任务中间更新GUI,我们可以将代码(用case {1}}方法编写)SwingUtilites.invokeLater(new RunnableToExecuteDoneMethodCode())放在case1中调用process()方法的地方。< / LI>

我问的是这个问题,因为问题Java - SwingWorker - Can we call one SwingWorker from other SwingWorker instead of EDT中指定的问题可以通过SwingUtilites.invokeLater(new RunnableToExecuteProcessMethodCode())解决,但无法通过publish()来解决

2 个答案:

答案 0 :(得分:6)

SwingWorker是一个帮助类 - 它不是你需要使用它,但使用它比手工完成同样的工作要简单得多,也更清晰。 (它还使检查进度更容易。)请注意,它已添加版本6 - 之前有些人使用了Swing Tutorial中定义的更简单的类,或者执行了类似于您所记录的类的步骤。

答案 1 :(得分:1)

1.6+ SwingWorker类的一个重要特性是doInBackground()和done()之间的EDT(Event Dispatch Thread)区别。您应该将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.