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

标签 java multithreading timer while-loop swingworker

在我最近发布的另一个问题中,建议我在 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/

相关文章:

python - 间隔重复功能?

java - DriverManager.getConnection() 超时?

c++ - C/C++ 计时器,如瑞士 watch

java - Tomcat如何处理PermGen空间异常?

java - 在Android中,如何使用Java反射调用sun.misc.Unsafe方法?

带有通配符的 Java 泛型在 Eclipse 中编译,但在 javac 中不编译

java - mustache 和 Internalviewresolvers - Spring MVC

java - 使用信号量的死锁

Java.util.Timer - 主线程结束时继续处理

c++ - clock() 在调试版本上运行良好,但在发布版本上不起作用(C++ VS2010)