【问题标题】:Why does establishing a JDBC connection freeze the UI thread? [duplicate]为什么建立 JDBC 连接会冻结 UI 线程? [复制]
【发布时间】:2015-10-25 20:26:41
【问题描述】:

我正在使用以下代码使用 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.start()?
  • 谢谢它的工作...发布它作为解决方案,我会接受它
  • 不知道为什么有人反对这个问题。 OP提供了足够的代码和一个问题。更不用说否决的选民没有费心解释原因。有些人只是令人沮丧。
  • @horin 将其作为答案发布。我似乎错过了您的评论(可能是因为您没有使用@CKing 向我发邮件)

标签: java multithreading jdbc


【解决方案1】:

简答

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

长答案

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    • 2021-11-03
    • 2011-06-22
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多