我创建了这个函数,我想使用多线程。
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方法,但第二次它工作。
我使用调试模式来观察正在发生的事情。我搜索了解决方案,但我没有得到最好的解决方案。
我的代码有什么问题?
答案 0 :(得分:0)
由于您在另一个线程上运行,fullname
实际上从未设置过。因此,当您返回fullName时,它很可能仍然是其初始值(可能为null)。
第二次执行此操作时,由于第一个线程最有可能完成其工作,因此您将获得结果。
这是一种典型的竞争条件。
对此的解决方案是使用像Consumer<String>
这样的东西,或者是一个非常糟糕的解决方案,它会锁定主线程,直到完成为止。
经验法则是你不能从多线程程序中return
而必须使用回调或锁定。首选方法是使用回调。