У меня есть приложение, которое должно иметь возможность:
Запуск:
- только нажатием кнопки «Пуск»
Стоп:
- нажатие кнопки «Стоп»
- нажатие кнопки «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» (приложение должно завершиться изящно ». Обратите внимание на примечания внизу файла.