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 并重写 doInBackground、process[= 等方法,而不是这个简单的代码片段24=] 和 完成.
仅使用 Thread 更新标签时效果很好。为什么我应该创建一个新的 class 来扩展 swingworker 并实现抽象方法?
我目前只能认为 Swing-worker 是线程安全的,这是答案吗?
Swing 不是线程安全的,在 EDT 上下文之外修改 UI,如您所愿,会导致随机绘制瑕疵和脏污问题,这几乎无法追踪。
有关详细信息,请参阅 Concurrency in Swing
SwingWorker
的publish
方法将更新推送到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
提供进度支持,这也是您提供反馈的另一种方式...
我无法真正获得使用 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 并重写 doInBackground、process[= 等方法,而不是这个简单的代码片段24=] 和 完成.
仅使用 Thread 更新标签时效果很好。为什么我应该创建一个新的 class 来扩展 swingworker 并实现抽象方法? 我目前只能认为 Swing-worker 是线程安全的,这是答案吗?
Swing 不是线程安全的,在 EDT 上下文之外修改 UI,如您所愿,会导致随机绘制瑕疵和脏污问题,这几乎无法追踪。
有关详细信息,请参阅 Concurrency in Swing
SwingWorker
的publish
方法将更新推送到a队列,在EDT内部处理,推送到process
方法。 done
也在 EDT 的上下文中调用,因此可以安全地从
现在,您可以使用类似...
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
提供进度支持,这也是您提供反馈的另一种方式...