在我最近发布的另一个问题中,建议我在 SwingWorker 中使用 java.util.Timer 而不是 while 循环。 SwingWorker 中的任务应该每 10 秒运行一次。
根据我的理解,java.util.Timer创建一个后台线程(run())来执行任务。
如果我在SwingWorker线程中使用java.util.Timer,在一个线程(SwingWorker)中再创建一个线程(Timer)不是效率低下吗?
请看一下我下面的两个示例,让我知道哪一个是正确的,或者如果两者都不正确,我还应该使用什么(如果可能,请为我提供一个简短的示例代码)?谢谢
示例 1 - 使用 java.util.Timer
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.SwingWorker;
public class Example1 extends SwingWorker<Void, String> {
@Override
protected Void doInBackground() {
int delay = 10000;//Delay for 10 seconds
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
String database = "";
//PARSE THE SQL DATABASE
publish(database);//UPDATE THE GUI
}
}, delay);
return null;
}
@Override
protected void process(List<String> s) {
//UPDATE THE GUI
}
}
示例 2 - 使用 While 循环
import java.util.List;
import javax.swing.SwingWorker;
public class Example2 extends SwingWorker<Void, String> {
@Override
protected Void doInBackground() {
while (!this.isCancelled()) {
String database = "";
//PARSE THE SQL DATABASE
publish(database);//UPDATE THE GUI
try {
synchronized (this) {
this.wait(10000);//Wait 10 seconds
}
} catch (Exception ex) {
}
}
return null;
}
@Override
protected void process(List<String> s) {
//UPDATE THE GUI
}
}
最佳答案
如果 SwingWorker
所做的唯一事情就是启动计时器,那么它确实毫无用处。只需从 UI 线程生成计时器并使用 SwingUtilities.InvokeLater
从计时器更新 GUI。
更好的选择是 ScheduledThreadPoolExecutor .
关于SwingWorker 线程中的 java.util.Timer 或 While 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12353215/