Java - 使用 Thread 而不是 SwingWorker

Java - using Thread instead of SwingWorker

我无法真正获得使用 swingworker 而不是简单地将繁重的任务放在(简单的)后台线程中的优势。

这只是一个代码片段,但显示了计算整数并将值放入 JLabel 的任务。 (这是在 ActionPerformed 内)

Thread t = new Thread() {
    public void run() {
        for (int i = 0; i < 2000000; i++) {
            counter++;
            label.setText(Integer.toString(counter));       
        }
    }
};

t.start();

有人告诉我使用抽象的 SwingWorker-class 并重写 doInBackgroundprocess[= 等方法,而不是这个简单的代码片段24=] 和 完成.

仅使用 Thread 更新标签时效果很好。为什么我应该创建一个新的 class 来扩展 swingworker 并实现抽象方法? 我目前只能认为 Swing-worker 是线程安全的,这是答案吗?

Swing 不是线程安全的,在 EDT 上下文之外修改 UI,如您所愿,会导致随机绘制瑕疵和脏污问题,这几乎无法追踪。

有关详细信息,请参阅 Concurrency in Swing

SwingWorkerpublish方法将更新推送到a队列,在EDT内部处理,推送到process方法。 done 也在 EDT 的上下文中调用,因此可以安全地从

更新 UI

现在,您可以使用类似...

Thread t = new Thread() {
    public void run() {
        int counter = 0 ;
        for (int i = 0; i < 2000000; i++) {
            counter++;
            SwingUtilities.invokeLater(new Runnable() {

                @Override
                public void run() {
                    label.setText(Integer.toString(counter));
                }
            });
        }
    }
};

t.start();

在 Java 8+ 下,您可能不会遇到很多问题,但是 Java 6 可能对匿名 类 需要一个 final 变量很挑剔,这就是我通常避免使用它的原因。

SwingWoker 也通过其 setProgress 方法和 PropertyChangeListener 提供进度支持,这也是您提供反馈的另一种方式...