Функции запуска и остановки приложения с поддержкой многопоточности - PullRequest
2 голосов
/ 15 марта 2020

У меня есть приложение, которое должно иметь возможность:

Запуск:

  • только нажатием кнопки «Пуск»

Стоп:

  • нажатие кнопки «Стоп»
  • нажатие кнопки «X»
  • , когда все задания выполнены (в основном метод Application.stop (), вызываемый из потока, не являющегося javafx)

Все должно происходить "изящно".

Код кнопок:

@FXML
private void start() {
    Application.start();
}

@FXML
private void stop() {
    Application.stop();
}

И основные функции Application start () и stop () (целые) Класс приложения):

public class Application {

    private static final AtomicBoolean isStarted = new AtomicBoolean(false),
            startPending = new AtomicBoolean(false),
            stopPending = new AtomicBoolean(false);

    private static final Object lock = new Object();

    //------Functionals below

    public static synchronized void start() {
        if(isStarted.get()) {
            Gui.showError("Application is already started");
            return;
        } else if(startPending.get() || stopPending.get()) return;
        isStarted.set(true);
        startPending.set(true);
        new Thread(startInternals()).start();
    }

    private static Runnable startInternals() {
        return () -> {
            synchronized(lock) {

                //do something

                Logger.print("Started");
                startPending.set(false);
            }
        };
    }

    public static synchronized void stop() {
        if(!isStarted.get()) {
            Gui.showError("Application is not started");
            return;
        } else if(stopPending.get()) return;
        isStarted.set(false);
        stopPending.set(true);
        new Thread(stopInternals()).start();
    }

    private static Runnable stopInternals() {
        return () -> {
            synchronized(lock) {

                //do something

                Logger.print("Stopped");
                stopPending.set(false);
            }
        };
    }

    //------Notes below

    /*
    ===RULES===
    --START:
    STARTED -> NO
    STOPPED -> YES
    STARTING -> NO
    STOPPING -> NO
    --STOP:
    STARTED -> YES
    STOPPED -> NO
    STARTING -> YES
    STOPPING -> NO
    */

}

Является ли этот подход полностью правильным? Есть ли способ сделать это лучше / проще?

PS. Я добавил возможность «остановить» при запуске в случае нажатия «X» (приложение должно завершиться изящно ». Обратите внимание на примечания внизу файла.

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