Остановить потоки до закрытия моей программы JavaFX
У меня возникли проблемы с закрытием моего приложения, поскольку некоторые потоки все еще работают после закрытия приложения.
Кто-то может мне помочь с каким-то способом остановить все потоки, выполняемые в фоновом режиме, прежде чем убить основной поток???
[EDITED]
С моими вопросами о javafx я заметил, что многие новые разработчики сталкиваются с проблемой управления Threads. Я хотел бы поделиться тем, что я сделал, чтобы упростить мою жизнь об управлении потоками на javafx. Я создал класс AsyncTask на основе AsyncTask с Android, который в основном делает то же самое для Android в скромном, но эффективном виде. Вы можете найти дополнительную информацию об этом на проект Github
Ответы
Ответ 1
Здесь у вас есть три варианта: проще всего создать свои потоки как деамоны, а это значит, что когда ваша основная программа закончится, все потоки деамонов тоже будут завершены.
Thread thread = new Thread();
thread.setDaemon(true);
Это проще всего, но недостатком является то, что вы не получите изящное завершение работы (т.е. потоки прекратятся, вы не получите возможность определять управление ресурсами и т.д., что может или не может быть проблемой для вас).
Альтернативой является сохранение удержания на порожденных потоках и когда ваша программа получает сигнал, чтобы закрыть вас, итерации по потокам и передать сигнал какого-то типа в signa, что они также должны прекратить выполнение
volatile boolean shutdown = false;
public void shutdown() {
shutdown = true;
}
public void run() {
while(!shutdown) {
... do your work here
}
... perform any cleanup work here
(Примечание: для ясности игнорирует обработку исключений)
Последний вариант - использовать инфраструктуру Executor в java.util.concurrent
ExecutorService executorService = Executors.newFixedThreadPool(10);
... assign/invoke tasks etc
... at some point later your program is told to shutdown
... shutdown in executor too
executorService.shutdown();
executorService.awaitTermination(10, TimeUnit.SECONDS); // wait for 10s in this case
executorService.shutdownNow();
Ответ 2
Лучший способ исправить это - добавить EventHandler в Закрыть запрос:
@Override
public void start(Stage primaryStage) {
primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent e) {
Platform.exit();
System.exit(0);
}
});
}
Ответ 3
Executors из пакета java.util.concurrent
- это путь. Явное:
ExecutorService executorService = Executors.newCachedThreadPool(new ThreadFactory() {
@Override
public Thread newThread(Runnable runnable) {
Thread thread = Executors.defaultThreadFactory().newThread(runnable);
thread.setDaemon(true);
return thread;
}
});
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1, r -> {
Thread thread = Executors.defaultThreadFactory().newThread(r);
thread.setDaemon(true);
return thread;
});
Ответ 4
Отмените класс приложений
//System.exit(0) This will close all timers and threads inside the Jar application...
@Override
public void stop() throws Exception {
super.stop(); //To change body of generated methods, choose Tools | Templates.
System.exit(0);
}