当我尝试调用thread.start()时,它不能第一次工作

时间:2018-03-14 02:54:31

标签: java android multithreading

我创建了这个函数,我想使用多线程。

public String selectQuery(final String qry) {

        new Thread(new Runnable() {
            @Override
            public void run() {
                statement = creatStatement();
                try {
                    resultSet = statement.executeQuery(qry);
                    while (resultSet.next()) {
                        fullName = resultSet.getString(1);
                    }
                    coloseConnection(resultSet);
                } catch (SQLException e) {
                    e.printStackTrace();
                }

            }
        }).start();

    return fullName;

   // return null;
}

我在按钮OnClick事件中调用了这个函数,但是当我第一次调用时,它没有显示任何内容,因为在启动线程之后没有执行run方法,但第二次它工作。

我使用调试模式来观察正在发生的事情。我搜索了解决方案,但我没有得到最好的解决方案。

我的代码有什么问题?

1 个答案:

答案 0 :(得分:0)

由于您在另一个线程上运行,fullname实际上从未设置过。因此,当您返回fullName时,它很可能仍然是其初始值(可能为null)。

第二次执行此操作时,由于第一个线程最有可能完成其工作,因此您将获得结果。

这是一种典型的竞争条件。

对此的解决方案是使用像Consumer<String>这样的东西,或者是一个非常糟糕的解决方案,它会锁定主线程,直到完成为止。

经验法则是你不能从多线程程序中return而必须使用回调或锁定。首选方法是使用回调。