java.util.Timer或SwingWorker线程中的While循环



在我最近发布的另一个问题中,有人建议我在SwingWorker中使用java.util.Timer,而不是while循环。SwingWorker中的任务应该每10秒运行一次。

据我所知,java.util.Timer创建了一个后台线程(run())来执行任务。

如果我在SwingWorker线程中使用java.util.Timer,那么在线程(SwingWorkers)中创建另一个线程(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。

最新更新