RxJava - основные убийства наблюдаемых потоков - PullRequest
0 голосов
/ 23 ноября 2018

Почему основной поток убивает мой поток rxJava?

public static void main(final String[] args) throws Exception {
    Observable.just(10)
        .subscribeOn(Schedulers.newThread())
        .subscribe(i -> print(i));
    Thread.sleep(100);
}

private static void print(final int i) {
    try {
        Thread.sleep(5000);
    } catch(final InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println(i);
}

print метод блокирует поток на 5000 миллисекунд, и я подумал, что JVM ожидает завершения всех потоков в приложении.В этом случае после выполнения Thread.sleep(100) программа закрывается, и я не вижу 10 в консоли.

Примечание. Если я буду использовать пользовательский Executor, например Executors.newFixedThreadPool(1);, он будет ждать до завершения работы, нос Schedulers.newThread() не будет.

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Schedulers.newThread() будет действовать как поток демона: если основной поток завершает работу - поток демона не будет останавливать JVM от остановки.В этом примере этот новый (daemon) поток перейдет в метод print и будет ждать 5 секунд, в то время как основной поток будет ожидать всего 0,1 секунды и просто завершит выполнение метода main.Вот и все ...

0 голосов
/ 23 ноября 2018

Если вы не используете ThreadPool, вы должны подождать (присоединиться) к созданному потоку самостоятельно, см. метод соединения ;есть некоторые перегрузки.

Вы можете получить все объяснения в javadoc о ThreadPoolExecutor , который предлагает вам этот вид управления.

Дайте мне знать, если вам нужна дополнительная информация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...