Я немного протестировал предложение в этой ветке: служба-исполнитель
и я немного упростил пример, чтобы его было легче понять. Итак, вот пример:
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 секунд до завершения основного потока. Чего я ожидал? Я ожидал, что служба-исполнитель будет ждать не более 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();
НО, здесь я ожидал, что основной поток не будет ждать завершения потока (соответственно службы исполнителя). Но это так. Насколько я понимаю, два примера ведут себя полностью вверх ногами в соответствии с описанием javadoc. javadoc говорит:
Этот метод не ожидает завершения активно выполняющихся задач. Для этого используйте awaitTermination.
Любые идеи?
С уважением Бернадо
awaitTermination
нужно позвонитьshutdown
. Вы не вызываетеshutdown
в своем коде. Так что неshutdownNow
, аshutdown
! Если вы не вызовете это, он будет ждать тайм-аута через 10 секунд. - person M. Deinum   schedule 11.11.2019awaitTermination
возвращаетboolean
, что в случаеfalse
означает, что он еще не выключился. Вот почему вы часто видитеawaitTermination
в цикле while.while(!awaitTermination(1, SECONDS) {}
. Который будет зацикливаться до тех пор, пока он действительно не завершится, а затем очистить ресурсы. - person M. Deinum   schedule 11.11.2019Flux.range(1, 3).publishOn(Schedulers.fromExecutorService(executorService)).delayElements(Duration.ofSeconds(3)) .subscribe(); executorService.shutdown(); System.out.println(executorService.awaitTermination(20, TimeUnit.SECONDS));
- person Bernado   schedule 11.11.2019thread.join
. Отключение приведет к отключению, если задачи будут завершены.awaitTermination
увидит это и закончит, как только все будет сделано. Если у вас нет длительной задачи, занимающей до 30 секунд, она вернет false. Я настоятельно рекомендую вам прочитать javadocsExecutorService
. - person M. Deinum   schedule 11.11.2019shutdownNow
не будет ждать.shutdown
будет ждать, если вы используетеawaitTermination
, иначе просто остановит программу. - person M. Deinum   schedule 12.11.2019delay
переместит его в другой планировщик, и с точки зрения однопоточного исполнителя он завершится, потому что все переместилось в другой поток. - person M. Deinum   schedule 12.11.2019