Я изучаю 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() завершил, что программа будет достаточно умна, чтобы выйти в этот момент, но, судя по всему, она сохраняет этот поток навсегда? Как заставить его запустить задачу один раз, а затем выйти?
Служба-исполнитель использует потоки non-daemon, которые препятствуют завершению JVM, попробуйте отключить службу после завершения с ней...
System.out.println("Started");
exService.execute(asynch);
exService.shutdown();
System.out.println("Good night sweet prince...");
Это заставит службу ждать, пока все текущие запущенные задачи не будут завершены, но не будут принимать какие-либо новые, которые будут добавлены...