【发布时间】:2018-08-01 16:33:30
【问题描述】:
我正在制作一个自动将数据发送到我的远程服务器的 java 应用程序。 我需要的是插入数据而不会让最终用户感到滞后。远程数据库更新部分应该在后台运行。我尝试了swingworker,线程但没有任何效果。仍然落后于我的应用程序。这是我到目前为止所做的事情
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 秒。
我怎样才能做到不造成延迟? 提前致谢。
【问题讨论】:
-
Swing Timer 中的代码在
Event Dispatch Thread (EDT)上执行,这会阻止 GUI 在任务完成之前自行更新。您应该创建一个单独的线程来执行长时间运行的任务。所以基本上你的代码是相反的。当您的应用程序启动时,您不应该启动线程。相反,您启动计时器。然后 Timer 将启动 Thread 进行服务器更新。 -
嗨。谢谢。但它不是每 15 秒创建一次新线程吗?
-
您到底为什么要为
ResultSet的每一行创建一个新的Socket?
标签: java multithreading swing concurrency timer