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



我使用以下代码使用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与在任何其他对象上调用任何其他方法一样好,没有特殊的含义。

最新更新