Невозможно остановить цикл while в потоке, изменив его логическое условие - PullRequest
1 голос
/ 04 июля 2019

Я решил создать каркас приложения для моего следующего семестра, чтобы сэкономить время на создании проектов, а также узнать больше о Java, мне просто нужно создать новое приложение (), отправить ему окно и другие требования, а затем вызвать приложение .start

Приложение расширяет Thread, run () открывает jframe, который представляет собой самодельную консоль, которая позволяет мне взаимодействовать с кодом, а затем переходит в цикл while, где я вставляю код для часов, как в видеоигре.

когда я набираю / выхожу в консоли, он вызывает функцию terminate () в приложении, которая отправляет консоли закрывающее сообщение и меняет логическое значение на false, завершая цикл, удаляя окна и затем закрывая поток и, следовательно, закрытие программы.

По какой-то причине уровень знаний моего ученика не знает, кажется, цикл продолжает работать.

Вызвав команду, которую я создал в консоли, которая возвращает значение запущенного логического значения, я определил, что команда выхода консоли действительно работает, и изменил логическое значение на false, но цикл продолжает работать. Я попытался вставить цикл minecraft, но он также не останавливается, перевод потока в спящий режим даже на 1 миллисекунду работает, и программа закрывается, как и предполагалось.

//where the application is started from

public static void main( String[] args ) {

        Application app = new Application("Test");

        app.start();
    }
//Application Class
public class Application extends Thread {

    static boolean running;
@Override
    public void run() {
        if ( true ) {
            console.open();
        }

        while ( running ) {

        }

        if ( window != null ) {
            window.dispose();
        }

        Console.dispose();

    }

    public static  void terminate() {
        Console.input( "Closing ..." );
        running = false;

    }
}

1 Ответ

0 голосов
/ 04 июля 2019

использовать переменную volatile

    //Application Class
public class Application extends Thread {
 private volatile boolean run_T = true;
    static boolean running;
@Override
    public void run() {
        if ( run_T ) {
            console.open();
        }

        while ( run_T ) {

        }

        if ( window != null ) {
            run_T=true;
            window.dispose();
        }

        Console.dispose();

    }

    public static  void terminate() {
        Console.input( "Closing ..." );
        running = false;

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...