【发布时间】:2018-02-04 13:00:22
【问题描述】:
我对并发还很陌生,我已经多次碰壁了。
代码几乎描述了所有内容,但只是为了澄清:用户按下按钮,应用程序将查询发送到数据库,同时 statusLabel 设置为:
非常好。
200 毫秒
非常好..
200 毫秒
非常好...
200 毫秒
查询结果
我已经做到了,但是现在,我需要在另一个类中使用查询结果(如果成功,则打开另一个窗口),但它永远不会。我得出的结论是,它只是在任务完成之前检查结果,所以结果总是错误的,我不知道如何解决这个问题,所以另一个类在任务完成后检查条件。
首先,我的Authorization 班级
public class Authorization {
private static String query = "";
private static boolean isValid;
private static Task<Void> task;
public static void verifyLogin(String username, String password) throws SQLException{
Status.get().unbind();
isValid = false;
task = new Task<Void>() {
@Override
protected Void call() throws SQLException {
while(!isCancelled()) {
try {
updateMessage("Weryfikacja.");
Thread.sleep(200);
updateMessage("Weryfikacja..");
Thread.sleep(200);
updateMessage("Weryfikacja...");
Thread.sleep(200);
if(username.equals("") || password.equals("")) {
task.cancel();
updateMessage("Pola nie mogą być puste");
} else {
query = "SELECT login FROM users WHERE login = ?";
Query.execute(query, username);
if(!Query.resultSet.next()) {
task.cancel();
updateMessage("Nie ma takiego użytkownika");
} else {
query = "SELECT password FROM users WHERE login = ?";
Query.execute(query, username);
if(Query.resultSet.next()) {
String passwordValue = Query.resultSet.getString(1);
if(!password.equals(passwordValue)) {
task.cancel();
updateMessage("Podane hasło jest błędne");
} else {
task.cancel();
updateMessage("");
isValid = true;
}
}
}
}
} catch(InterruptedException e) {
if(isCancelled()) {
break;
}
}
}
return null;
}
};
Status.get().bind(task.messageProperty());
new Thread(task).start();
}
public static boolean isValid() {
return isValid;
}
}
从另一个类调用
private void login() {
if( SqlConnection.isConnected()) {
try{
Authorization.verifyLogin(String.valueOf(loginInput.getText()), String.valueOf(passwordInput.getText()));
if(Authorization.isValid()) {
//should go to next menu
//but never does
}
} catch (SQLException e) {
e.printStackTrace();
Debug.log(e.toString());
}
}
}
编辑#
对不起updateMessage() 的润色。
【问题讨论】:
-
代码很混乱。任务中
while循环的目的是什么?看起来您在循环的第一次迭代中调用了cancel(),在所有可能的条件下,那么为什么要使用循环呢?无论如何,您的verifyLogin()方法只是在另一个线程中启动验证过程,然后立即退出。isValid标志在该线程完成之前不会更改,这会在很久以后发生。如果你想做验证过程,然后做其他事情,那么管理verifyLogin()中的线程真的没有意义。
标签: multithreading javafx concurrency