Подтвердить что ты не робот

Остановить потоки до закрытия моей программы JavaFX

У меня возникли проблемы с закрытием моего приложения, поскольку некоторые потоки все еще работают после закрытия приложения. Кто-то может мне помочь с каким-то способом остановить все потоки, выполняемые в фоновом режиме, прежде чем убить основной поток???

[EDITED]

С моими вопросами о javafx я заметил, что многие новые разработчики сталкиваются с проблемой управления Threads. Я хотел бы поделиться тем, что я сделал, чтобы упростить мою жизнь об управлении потоками на javafx. Я создал класс AsyncTask на основе AsyncTask с Android, который в основном делает то же самое для Android в скромном, но эффективном виде. Вы можете найти дополнительную информацию об этом на проект Github

4b9b3361

Ответ 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;
    }
});

версия Java 8 с фиксированным ScheduledExecutorService

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);
}