Почему этот FutureTask вызывает зависание моей программы навсегда?

1

Я изучаю Java и пытаюсь понять, как работает FutureTasks. В моем конкретном случае я пытаюсь создать поток (FutureTask) для выполнения чего-то. Я действительно не забочусь о его ответе; Я просто хочу, чтобы он выполнял асинхронно. У меня так много работы со следующим тестовым кодом:

public class Main {
    public static void main(String[] args) {
        ExecutorService exService = Executors.newSingleThreadInstance();
        FutureTask<Boolean> asynch = new FutureTask<>(new Callable<Boolean>() {
            @Override
            public Boolean call() {
                try {
                    //  wait for 5 seconds to simulate activity
                    Thread.sleep(5000);
                } catch (InterruptedException ex) {
                    Thread.currentThread().interrupt();
                }
                System.out.println("Complete");
                return true;
            }
        });

        System.out.println("Started");
        exService.execute(asynch);
    }
}

Когда я запускаю этот код, он печатает "Started" на консоли, а через пять секунд печатает "Complete", как я ожидал. Однако... программа просто висит бесконечно в этот момент. Я предполагал, что, поскольку метод call() завершил, что программа будет достаточно умна, чтобы выйти в этот момент, но, судя по всему, она сохраняет этот поток навсегда? Как заставить его запустить задачу один раз, а затем выйти?

  • 2
    Служба executor использует потоки, не являющиеся демонами, что препятствует завершению JVM. Попробуйте закрыть сервис
  • 0
    Почему все делают комментарии вместо ответов здесь? Это сработало отлично; это было недостающее звено. Запишите это в ответ, и я приму это.
Показать ещё 1 комментарий
Теги:

1 ответ

5
Лучший ответ

Служба-исполнитель использует потоки non-daemon, которые препятствуют завершению JVM, попробуйте отключить службу после завершения с ней...

    System.out.println("Started");
    exService.execute(asynch);
    exService.shutdown();
    System.out.println("Good night sweet prince...");

Это заставит службу ждать, пока все текущие запущенные задачи не будут завершены, но не будут принимать какие-либо новые, которые будут добавлены...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню