Тонкость цикла Java

1

У меня есть следующий код:

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

  • 0
    может быть, ваша программа завершает работу до того, как вы ее увидели?
  • 2
    Пожалуйста, включите еще немного этой программы для контекста, в частности, функцию getDone ().
Показать ещё 5 комментариев
Теги:
loops
while-loop

1 ответ

2

Это может произойти, если loggeIn или переменная, возвращаемая getDone устанавливается в true другим потоком и не объявляется volatile.

Может быть проще определить вашу проблему, если вы дадите немного больше кода.

  • 0
    Нет нескольких потоков. Смотрите отредактированный вопрос для большего количества кода.
  • 0
    @ Cardsox425 - Как говорит Олег - вы используете Swing, поэтому за кулисами происходит множество потоков. Попробуйте установить done для volatile . Я думаю, что это решит вашу проблему.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню