Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RxJava调度程序始终在同一个线程中使用睡眠_Java_Multithreading_Rx Java_Reactive Programming_Rx Java2 - Fatal编程技术网

RxJava调度程序始终在同一个线程中使用睡眠

RxJava调度程序始终在同一个线程中使用睡眠,java,multithreading,rx-java,reactive-programming,rx-java2,Java,Multithreading,Rx Java,Reactive Programming,Rx Java2,我尝试在不同的线程上运行每个计算,但无论我使用什么调度程序,它总是在单个线程上运行 PublishProcessor processor = PublishProcessor.create(); processor .doOnNext(i ->System.out.println(i.toString()+" emitted on "+Thread.currentThread().getId())) .observeOn(Schedulers.ne

我尝试在不同的线程上运行每个计算,但无论我使用什么调度程序,它总是在单个线程上运行

PublishProcessor processor = PublishProcessor.create();

    processor
        .doOnNext(i ->System.out.println(i.toString()+" emitted on "+Thread.currentThread().getId()))
        .observeOn(Schedulers.newThread()).subscribe(i -> {
            System.out.println(i.toString()+" received on "+Thread.currentThread().getId());
            Thread.currentThread().sleep(5000);
        });
    processor.onNext(2);
    processor.onNext(3);
    processor.onNext(4);
    processor.onNext(5);
    processor.onNext(6);


    while (true) {}
产出将是:

2 emitted on 1
3 emitted on 1
4 emitted on 1
5 emitted on 1
6 emitted on 1
2 received on 13
3 received on 13
4 received on 13
5 received on 13
6 received on 13
线程13只在睡眠后处理下一个值,但我希望在这种情况下有几个单独的睡眠线程。 有人能解释一下我做错了什么吗?

。observeOn(…)
通过将项目流更改为另一个线程来生效,但它始终是同一个线程

如果你想为你能做的每一件事创建一个新的线程

processor
    .doOnNext(i ->System.out.println(i.toString()+" emitted on "+Thread.currentThread().getId()))
    .flatMap(item -> Observable.just(item)
                         .subscribeOn(Schedulers.newThread()))    // make every item change to a new thread
    .subscribe(i -> {
        System.out.println(i.toString()+" received on "+Thread.currentThread().getId());
        Thread.currentThread().sleep(5000);
    });

observeOn只影响下游用户。您需要订阅以影响处理器的工作位置。如果您需要parallex,无论是使用内置并行操作符还是类似flatMap(o->o.subscribeOn(Schedulers.io())的东西)。更多信息你可以在这里看到:非常感谢你,这个链接非常有用!它仍在同一线程上运行。也许这是出版商的行为<代码>2在1上发出3在1上发出4在1上发出6在1上发出13在14上收到2在14上收到4在14上收到4在14上收到5在14上收到6在14上收到解决方案是让它在.subscribeOn(Schedulers.newThread()即
.flatMap(项目->可流动的.just(项目)之后立即在映射块中休眠
.subscribeOn(Schedulers.newThread())
.map(i->{
System.out.println(i.toString()+”在
“+Thread.currentThread().getId());
Thread.currentThread().sleep(5000);
返回i;
}))