Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.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
RXJava2读卡器可通过并发订户观察_Java_Multithreading_Rx Java2 - Fatal编程技术网

RXJava2读卡器可通过并发订户观察

RXJava2读卡器可通过并发订户观察,java,multithreading,rx-java2,Java,Multithreading,Rx Java2,我正试图通过一个BufferedReader实现一个RXJava2Observable。到目前为止一切顺利: public class Launcher { public static void main(String[] args) throws Exception { Process process = Runtime.getRuntime().exec("ls /tmp"); BufferedReader reader = new Buffered

我正试图通过一个
BufferedReader
实现一个RXJava2
Observable
。到目前为止一切顺利:

public class Launcher {
    public static void main(String[] args) throws Exception {

        Process process = Runtime.getRuntime().exec("ls /tmp");
        BufferedReader reader = new BufferedReader (new InputStreamReader(process.getInputStream()));

        Observable source = Observable.create(emitter -> {
            String line = "";
            while (line != null) {
                line = reader.readLine();
                if (line == null)
                    break;
                System.out.println("Engine " + Thread.currentThread().getName() + " - " + line); //process line
                emitter.onNext(line);
            }
            emitter.onComplete();
        }).subscribeOn(Schedulers.newThread());

        source.subscribe(line -> System.out.println("UI 1   " + Thread.currentThread().getName() + " - " + line));
        source.subscribe(line -> System.out.println("UI 2   " + Thread.currentThread().getName() + " - " + line));

        TimeUnit.SECONDS.sleep(10);

    }
}
onSubscribe
以并行方式通知订阅者。如果我没有弄错的话,这意味着
create()
中的lambda将为每个使用者并行执行

因此,如果我有两个订阅者,他们每个人都能得到阅读器的一半行。线程1调用获取一行的
readLine()
,线程2不会获取该行,只会获取下一行

这一切都是有道理的,不过,我肯定错过了什么,因为我不知道如何:

  • 用一根线读这些行
  • 同时通知所有订阅者-这样每个订阅者都可以获得所有行
  • 我查看了
    主题
    s,试图将
    可观察的
    s链接起来,但仍然无法理解

    Edit:我将示例更新为完全可运行的类。据我所知,这个问题是热与冷的对比。好像文档中说,
    可观察。create(…)
    应该创建一个冷的,而我的代码显然表现为热的

    后续问题:如果我添加类型参数使其
    可观察
    ,那么
    onSubscribe
    调用将中断代码,并且它不会编译,因为这将返回
    可观察
    。为什么?对中间参数调用subscribe,效果很奇怪:

    Observable<String> source = Observable.create(emitter -> {...});
    Observable<String> source2 = source.subscribeOn(Schedulers.newThread())
    
    Observable source=Observable.create(发射器->{…});
    Observable source2=source.subscribeOn(Schedulers.newThread())
    
    使用
    发布

    ConnectableObservable<String> o = Observable.create(emitter -> {
        try (BufferedReader reader = ...) {
            while (!emitter.isDisposed()) {
                String line = reader.readLine();
                if (line == null || line.equals("end")) {
                    emitter.onComplete();
                    return;          
                }
                emitter.onNext(line);
            }
        }
    }).subscribeOn(Schedulers.io())
      .publish();
    
    o.subscribe(/* consumer 1 */);
    o.subscribe(/* consumer 2 */);
    
    o.connect();
    
    ConnectableObservable o=可观察。创建(发射器->{
    try(BufferedReader读取器=…){
    而(!emitter.isDisposed()){
    字符串行=reader.readLine();
    如果(line==null | | line.equals(“end”)){
    emitter.onComplete();
    返回;
    }
    发射器.onNext(行);
    }
    }
    }).subscribeOn(Schedulers.io())
    .publish();
    o、 订阅(/*消费者1*/);
    o、 认购(/*消费者2*/);
    o、 connect();
    
    请查看我的编辑和可运行示例。发布不起作用,实际上什么都没有打印出来。也许我错过了什么?连接后你睡觉了吗?很酷,成功了!!!谢谢这是路吗?create真的是在给我一个热的可观察对象,还是在这里发生了其他事情?来自:“提供一个API(通过一个冷的可观察对象),它将反应式世界与回调式世界连接起来。”。您只是共享了一个基础资源,而不是您所需要的方式。是否要在不同的线程上并行运行两个观察程序?