【问题标题】:Java - Difference between SwingWorker and SwingUtilities.invokeLater()Java - SwingWorker 和 SwingUtilities.invokeLater() 之间的区别
【发布时间】:2010-05-13 18:41:35
【问题描述】:

SwingWorker 用于以下目的:

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

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

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

我问这个问题是因为Java - SwingWorker - Can we call one SwingWorker from other SwingWorker instead of EDT 中指定的问题可以通过SwingUtilities.invokeLater() 解决,但不能通过SwingWorker 解决

【问题讨论】:

  • 我不太确定“问题”是什么。
  • @akf 如果你不确定,那就离开吧。简单:)
  • 你提到的问题可以使用 SwingWorker 解决。在那里查看我的答案。

标签: java swingworker swingutilities


【解决方案1】:

SwingWorker 是一个辅助类——不是你需要使用它,而是使用它比手工做同样的工作要简单得多、清晰得多。 (它还使检查进度更容易。)请注意,它是在第 6 版中添加的——在此之前,有些人使用了 Swing 教程中定义的更简单的类,或者执行了与您提到的类似的步骤。

【讨论】:

【解决方案2】:

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.

【讨论】:

    猜你喜欢
    • 2013-10-27
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 2016-06-29
    • 2012-09-03
    • 2016-03-28
    • 2017-12-23
    相关资源
    最近更新 更多