java - 在后台使用 JAVA 计时器,不会导致 UI 出现任何延迟

标签 java multithreading swing concurrency timer

我正在制作一个java应用程序,它自动将数据发送到我的远程服务器。 我需要的是插入数据而不会给最终用户带来滞后感。远程数据库更新部分应该在后台运行。我尝试了 Swingworker、Thread 但没有任何效果。仍然落后于我的应用程序。这是我到目前为止所做的

public class uploader extends Thread {

    static Socket socket;
    static Timer ttt;

    public void run() {
        try {
            ttt = new Timer(15000, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {

                    try {

                        socket = new Socket("192.168.10.1", 3306);                   

//upload
                        ResultSet rs = DB.search("select query,id FROM general_log where state = 0 order by id asc");
                        while (rs.next()) {
                            try {
                                socket = new Socket("192.168.10.1", 3306);
                                DB2.acknowledge(rs.getString(1));
                                DB.acknowledge("update general_log set state = 1 where id = '" + rs.getString(2) + "'");

                            } catch (Exception e1) {
                                e1.printStackTrace();
                                System.out.println("error");
                                break;
                            }

                        }

                    } catch (Exception e3) {
                        System.out.println("error");
                        e3.printStackTrace();
                    }

                }
            });
            ttt.start();


        } catch (Exception e) {
            e.printStackTrace();

        }

    }

}

我在启动时运行它

Thread upl = new Thread(new uploader());
upl.start();

每 15 秒本地数据应上传到远程服务器。但在这里,当计时器运行时,我的 UI 会滞后 15 秒。

如何在不造成延迟的情况下做到这一点? 提前致谢。

最佳答案

你可以使用索引优化 SQL 查询,这是肯定的。

除了主要问题之外,使用在 new Handler() 中启动的计时器任务不是更好吗?

==============================================

例如,创建一个方法而不是类:

private final Handler handler = new Handler();
private TimerTask timerTask;
private Timer timer = new Timer();



...

    public void sendBackgroundData() {

    timerTask = new TimerTask() {
        @Override
        public void run() {
            handler.post(() -> {

DO YOUR CODE

                    }
            });
        }
    };
    timer.schedule(timerTask, 0, 2000);
}

关于java - 在后台使用 JAVA 计时器,不会导致 UI 出现任何延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51638262/

相关文章:

java - 打开 JPA : MetaDataException After upgrading to Open JPA 2. 4.1 和 Java 8

python - PyQt : updating GUI from a callback

c - fork 和现有线程?

java - 尝试使 JTable 中的链接可单击时出现未处理的异常类型 URISyntaxException

java - 日历中的表格单元格编辑器

java - 如何使 JTable 单元格不可编辑,但应该能够选择并复制当前单元格中的值

java - 与Android/java中的今天相比,两个日期之间的百分比

java - 如何创建一个可以在不同 Activity 中多次引用的util

java - 未调用 Servlet 过滤器

Java 使用 spring 异步保存/更新数据到数据库中