我使用以下代码使用JDBC打开与SQL数据库的连接
Runnable getConn = new Runnable() {
@Override
public void run() {
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(DB_URL, USER, PASS);
tracking = true;
activity.run();
} catch (SQLException se) {
se.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
};
Thread connection = new Thread(getConn);
connection.run();
它可以工作,但它会冻结UI线程,直到连接打开。关于如何将此移动到单独的线程以便它不会停止UI线程的任何想法?我使用asyncTask
在android上做这个,但我不知道如何用Java做。
答案 0 :(得分:4)
简答
您需要将connection.run()
语句更改为connection.start()
。
答案很长
每个Java程序都使用 main 线程开始执行。换句话说,当您运行具有main
方法的Java程序(例如java MyProgram)时,将使用此堆栈底部的main
方法创建新的执行堆栈。
如果程序在Thread
方法中创建main
实例并在线程实例上调用start
方法,则将使用run
创建新的执行堆栈堆栈底部的方法。您现在将拥有两个执行堆栈。一个在堆栈底部使用main
方法,另一个在堆栈底部使用run
方法。这两个堆栈可以并行继续执行。
另一方面,如果在run
方法中的线程实例上调用main
,则只需在与main
方法相同的执行堆栈中调用它。不会创建新的执行堆栈。因此,在线程实例上调用run
与在任何其他对象上调用任何其他方法一样好,并且没有特殊含义。