为什么建立JDBC连接会冻结UI线程?

时间:2015-08-03 16:23:34

标签: java multithreading jdbc

我使用以下代码使用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做。

1 个答案:

答案 0 :(得分:4)

简答

您需要将connection.run()语句更改为connection.start()

答案很长

每个Java程序都使用 main 线程开始执行。换句话说,当您运行具有main方法的Java程序(例如java MyProgram)时,将使用此堆栈底部的main方法创建新的执行堆栈。

如果程序在Thread方法中创建main实例并在线程实例上调用start方法,则将使用run创建新的执行堆栈堆栈底部的方法。您现在将拥有两个执行堆栈。一个在堆栈底部使用main方法,另一个在堆栈底部使用run方法。这两个堆栈可以并行继续执行。

另一方面,如果在run方法中的线程实例上调用main,则只需在与main方法相同的执行堆栈中调用它。不会创建新的执行堆栈。因此,在线程实例上调用run与在任何其他对象上调用任何其他方法一样好,并且没有特殊含义。