我使用以下代码使用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线程的想法?我在android上使用asyncTask
,但我不知道如何在Java中做到这一点。
简短回答
需要将connection.run()
语句修改为connection.start()
。
每个Java程序都是从main线程开始执行的。换句话说,当您运行具有main
方法的Java程序(例如Java MyProgram)时,将在该堆栈的底部创建一个新的执行堆栈,并使用main
方法。
如果一个程序在main
方法中创建了一个Thread
实例,并在线程实例中调用了start
方法,那么一个新的执行堆栈将被创建,run
方法位于堆栈的底部。你现在有两个执行堆栈。一个在堆栈的底部使用main
方法,另一个在堆栈的底部使用run
方法。这两个栈可以继续并行执行。
另一方面,如果您在main
方法中的线程实例上调用run
,它将简单地在与main
方法相同的执行堆栈中调用。不会创建新的执行堆栈。因此,在线程实例上调用run
与在任何其他对象上调用任何其他方法一样好,没有特殊的含义。