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
实现一个RXJava2Observable
。到目前为止一切顺利:
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(通过一个冷的可观察对象),它将反应式世界与回调式世界连接起来。”。您只是共享了一个基础资源,而不是您所需要的方式。是否要在不同的线程上并行运行两个观察程序?