Multithreading Rxjava:在特定线程上订阅
我是Rxjava的新手。 我有以下代码:Multithreading Rxjava:在特定线程上订阅,multithreading,rx-java,subscriber,Multithreading,Rx Java,Subscriber,我是Rxjava的新手。 我有以下代码: System.out.println("1: " + Thread.currentThread().getId()); Observable.create(new rx.Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subcriber) {
System.out.println("1: " + Thread.currentThread().getId());
Observable.create(new rx.Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subcriber) {
System.out.println("2: " + Thread.currentThread().getId());
// query database
String result = ....
subcriber.onNext(result);
}
}).subscribeOn(Schedulers.newThread()).subscribe(countResult -> {
System.out.println("3: " + Thread.currentThread().getId());
});
System.out.println(“1:+Thread.currentThread().getId());
创建(新的rx.Observable.OnSubscribe(){
@凌驾
public void call(Subscriber使用RxJava 1.0.15,您可以在subscribe
之前应用toBlocking()
,所有操作都将在创建整个操作符序列的线程上运行。因此subscribeOn表示可观察对象将开始在哪个线程上发射项,observeOn“开关”到可观察链其余部分的线程。放置一个observeOn(schedulers.CurrentThread())就在订阅之前,您将处于创建此可观察对象的线程中,而不是它在其中执行的线程中。这里有一个资源可以很好地解释rxjava线程。我相信@akarnokd是正确的。您可以在没有.subscribeOn(Schedulers.newThread())的情况下运行
以使其同步发生,或在订阅之前使用toBlocking()
。或者,如果您只希望所有事情都发生在同一个线程上,但不必是当前线程,则可以执行以下操作:
Observable
.defer(() -> Observable.create(...))
.subscribeOn(Schedulers.newThread())
.subscribe(subscriber);
defer
确保对create
的调用发生在订阅线程上。我认为有两种情况。要么需要它在UI线程上运行,要么是因为同步。正如我所知,您不能在特定线程上调用函数,因为调用该方法时,它绑定到thr的上下文ead,因此不可能从一个线程向另一个线程调用方法。您的问题是订阅服务器中的方法是从调度程序.newThread()
调用的。我还发现了关于调度程序.currentThread()。您需要的是在调用观察程序时通知调用程序线程
您还可以使用akka,使用它编写并发代码要简单得多
对不起,我的语法不好。来自:
默认情况下,可观察对象和应用于的运算符链
它将在同一线程上完成其工作并通知其观察员
在其上调用Subscribe方法。SubscribeOn运算符
通过指定另一个调度程序来更改此行为
Observable应运行。ObserveOn运算符指定
Observable将用于发送通知的不同计划程序
向其观察员表示感谢
因此,您可以使用subscribeOn(而不是subscribeOn)在创建收藏的同一线程上观察它,如下所示:
Observable.create(new rx.Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subcriber) {
System.out.println("2: " + Thread.currentThread().getId());
// query database
String result = ....
subcriber.onNext(result);
}
}).subscribe(countResult -> {
System.out.println("3: " + Thread.currentThread().getId());
});
Observable.create(新的rx.Observable.OnSubscribe(){
@凌驾
公开作废通知(subscriber我认为OP不想让他/她的代码同步。相反,他想在调用每个订阅者之前切换到某个线程。OP提到了线程50,这是启动异步计算的线程。除了阻止subscribe返回到同一个线程之外,别无他法。我正在考虑提供一个Exe剪切服务
到调度程序。从(executorService)
,类似这样:executorService executorService=Executors.newSingleThreadExecutor(r->Thread.currentThread())
。不幸的是,由于IllegalThreadStateException
而崩溃。RxJava中没有CurrentThread调度程序,除非调度程序是单线程的,否则无法通过多个观察将执行返回到管道不同部分的同一线程。请尝试Schedulers.immediate(),它“创建并返回{@link Scheduler}立即在当前线程上执行工作。“这仍然不符合创建线程,实际上是一个否定的操作。您能告诉我们为什么要这样做吗?我们缺少一些上下文。奇怪的是,他们提到了AndroidSchedulers.handlerThread,但我的rxjava中没有这样的方法。”。。