RxJava 中 AndroidSchedulers.mainThread() 的替代方法是什么?

What is the alternative to AndroidSchedulers.mainThread() in RxJava?

在 RxJava 中是否有与 RxAndroid 中的 AndroidSchedulers.mainThread() 同义的调度程序 api。 所以如果我在一个新线程上安排一个任务并且我想在 Java 主线程上观察它,我该怎么做?

编辑 下面是一个 RxSubscription 的例子,带有 system.in 注释,主线程被杀死,而 Observable.interval 运行s 在一个单独的线程上。在 Android 中,我可以说 observeOn(AndroidSchedulers.MainThread),此后的任何操作都会在主线程上 运行。我正在 Java 中寻找类似的调度程序,因为 AndroidSchedulers 是 RxAndroid.

的一部分
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import rx.Observable;

public class Main {

public static void main(String[] args) throws InterruptedException, IOException {

    Observable<Long> values = Observable.interval(1000, TimeUnit.MILLISECONDS);
    values.subscribe(
            v -> System.out.println("Received: " + v),
            e -> System.out.println("Error: " + e),
            () -> System.out.println("Completed")
    );
    //System.in.read();
}
}

是的,RxJava 有调度程序。要向任何线程发送消息,您需要有某种消息循环来等待来自其他线程的消息。在 Android 中,这是您的 Looper。在 Java,你需要自己做。然后,您的调度程序会向该线程发送一条消息,并在该消息响应中完成工作。该机制取决于您如何实现消息队列,但应该相当简单。

返回到 "main" Java 线程目前是不可能的,因为没有用于 RxJava 1.x.

的阻塞调度程序

万一你可以升级到RxJava 2.x,我有一个特殊的Scheduler可以"pinned"到当前线程:

compile "com.github.akarnokd:rxjava2-extensions:0.15.1"

BlockingScheduler

This type of scheduler runs its execution loop on the "current thread", more specifically, the thread which invoked its execute() method. The method blocks until the shutdown() is invoked. This type of scheduler allows returning to the "main" thread from other threads.

public static void main(String[] args) {
    BlockingScheduler scheduler = new BlockingScheduler();

    scheduler.execute(() -> {
        Flowable.range(1, 10)
            .subscribeOn(Schedulers.io())
            .observeOn(scheduler)
            .doAfterTerminate(() -> scheduler.shutdown())
            .subscribe(v -> System.out.println(v + " on " + Thread.currentThread()));
    });

    System.out.println("BlockingScheduler finished");
}