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
Multithreading Rxjava:在特定线程上订阅_Multithreading_Rx Java_Subscriber - Fatal编程技术网

Multithreading 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) {

我是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("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中没有这样的方法。”。。