SubmissionPublisher<String> publisher = new SubmissionPublisher<>();
Создает новый SubmissionPublisher, используя ForkJoinPool.commonPool () для асинхронной доставки подписчикам
см .: https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/SubmissionPublisher.html#SubmissionPublisher--
Так на самом деле
strs.stream().forEach(i -> publisher.submit(i));
ставит все заявки в очередь и асинхронно доставляет их в другой поток.Но затем приложение прекращается.Это не зависит от прогресса рабочего потока.Это означает, что приложение завершается независимо от того, сколько элементов рабочий поток уже доставил.
Это может отличаться для каждого прогона.В худшем случае приложение может быть прекращено до того, как будет доставлен первый элемент.
Потоки
Если вы хотите убедиться, что основной метод MyReactiveApp и доставкав OnSext MySubscriber происходит на разных потоках, вы можете распечатать имена соответствующих потоков, например, в основной MyReactiveApp:
System.out.println(Thread.currentThread().getName())
будет выводить main
в качестве имени потока.
Принимая во внимание, что метод onSext MySubscriber будет, например, выводить что-то вроде ForkJoinPool.commonPool-worker-1
.
Потоки пользователя и Деймона
Почему приложение завершается, хотя у нас все еще есть работающий поток?
В Java существует два вида потоков:
- пользовательские потоки
- потоки демонов
Java-программа завершает свою работу, когда пользовательские потоки больше не выполняются, даже когда потоки deamon все еще работают.
Основной поток - это пользовательский поток.SubmissionPublisher использует здесь рабочие потоки из ForkJoinPool.commonPool ().Это потоки демонов.
Все рабочие потоки инициализируются с установленным значением Thread.isDaemon ().
https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/ForkJoinPool.html