У меня есть следующий код:
while(!loggedIn) {
loggedIn = login.getDone();
}
System.out.println("madeIt");
Линия печати никогда не выполняется, хотя я знаю, что login.getDone() возвращает true в какой-то момент. Если, однако, я использую следующий код:
while(!loggedIn) {
loggedIn = login.getDone();
System.out.println(loggedIn);
}
System.out.println("madeIt");
Затем выполняется последняя строка печати. Понятия не имею почему. Кто-нибудь знает, почему это происходит?
Для получения большего количества кода см. Весь мой основной класс:
public class GameManager {
public static void main (String args[]) {
boolean loggedIn = false;
String username;
int playerNum;
int i = 0;
Login login = new Login();
while (!loggedIn){
loggedIn = login.getDone();
//System.out.println(loggedIn);
}
login.close();
System.out.println("Logged in");
}
}
и весь класс входа:
import squint.*;
import javax.swing.*;
import java.util.*;
public class Login extends GUIManager {
private final int WINDOW_WIDTH = 200, WINDOW_HEIGHT = 150;
private JButton login;
String name;
boolean done;
int playerNumber;
public Login() {
done = false;
this.createWindow( WINDOW_WIDTH, WINDOW_HEIGHT );
this.setTitle("Hearts Login");
login = new JButton("Click");
contentPane.add(login);
}
public void buttonClicked( ) {
done = true;
System.out.println(done);
}
public boolean getDone() {
return done;
}
}
И косоглазие можно найти по адресу http://dept.cs.williams.edu/~cs134/squintV2.20.jar
Это может произойти, если loggeIn
или переменная, возвращаемая getDone
устанавливается в true
другим потоком и не объявляется volatile
.
Может быть проще определить вашу проблему, если вы дадите немного больше кода.
done
для volatile
. Я думаю, что это решит вашу проблему.