Я немного поэкспериментировал с предложением в этой теме: flux внутри executorservice
, и я немного упростил пример, чтобы понять его проще. Итак, вот пример:
ExecutorService executorService = Executors.newSingleThreadExecutor();
Flux.just("1", "2", "3").subscribeOn(Schedulers.fromExecutorService(executorService)).doOnNext(System.out::println).subscribe();
try {
executorService.awaitTermination(10, TimeUnit.SECONDS);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
executorService.shutdownNow();
}
Но теперь, если это выполняется, он всегда ждет 10 секунд, прежде чем основной поток завершится. Чего я ожидал? Я ожидал, что служба executor подождет максимум 10 секунд, пока не продолжит работу и не вызовет завершение работы. Обычно это должно быть сделано за несколько миллисекунд и возвращаться сразу после печати 1, 2, 3. Javadoc говорит здесь:
Блокирует, пока все задачи не завершат выполнение после запроса на выключение или не истечет время ожиданияили текущий поток прерывается, в зависимости от того, что произойдет раньше.
Я не понимаю. Что здесь не так?
Еще один пример, который запускается и заканчивается сразу (но, на мой взгляд, неправильно):
ExecutorService executorService = Executors.newSingleThreadExecutor();
Flux.range(1, 1_000_000).subscribeOn(Schedulers.fromExecutorService(executorService)).doOnNext(System.out::println).subscribe();
executorService.shutdownNow();
НО, здесь я бы ожидал, что основной поток не 't дождаться завершения потока (соответственно, службы исполнителя). Но это так. В моем понимании два примера ведут себя полностью вверх ногами в соответствии с описанием Javadoc. Javadoc говорит:
Этот метод не ожидает активного завершения задач для завершения. Используйте awaitTermination, чтобы сделать это.
Есть идеи?
С уважением, Бернадо