1

最近投稿した別の質問では、whileループの代わりにSwingWorkerでjava.util.Timerを使用するように提案されました。SwingWorkerのタスクは10秒ごとに実行されることになっています。

私の理解では、java.util.Timerはタスクを実行するためのバックグラウンドスレッド(run())を作成します。

SwingWorkerスレッドでjava.util.Timerを使用する場合、スレッド(SwingWorker)に別のスレッド(Timer)を作成するのは非効率的ではありませんか?

以下の2つの例を見て、どちらが正しいかを教えてください。どちらも正しくない場合は、他に何を使用する必要がありますか(可能であれば、短いサンプルコードを提供してください)。ありがとうございました

例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
    }
}
4

1 に答える 1

2

タイマーを起動することだけが行われSwingWorkerている場合、それは実際には役に立たない。UIスレッドからタイマーを生成し、タイマーからSwingUtilities.InvokeLaterGUIを更新するために使用するだけです。

さらに良い代替手段はScheduledThreadPoolExecutorです。

于 2012-09-10T14:01:58.850 に答える