【发布时间】:2015-06-04 00:44:47
【问题描述】:
我很难理解 subscribeOn/observeOn 在 RxJava 中是如何工作的。我用 observable 创建了一个简单的应用程序,它发出太阳系行星名称,进行一些映射和过滤并打印结果。
据我了解,将工作调度到后台线程是通过 subscribeOn 运算符完成的(而且它似乎工作正常)。
在后台线程上观察也适用于observeOn 运算符。
但是我很难理解,如何观察调用线程(无论是主线程还是其他线程)。在 Android 上使用AndroidSchedulers.mainThread() 运算符很容易完成,但我不知道如何在纯 java 中实现。
这是我的代码:
public class Main {
public static void main(String[] args) throws InterruptedException {
ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 5, 3000L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
System.out.println("Main thread: " + getCurrentThreadInfo());
Observable<String> stringObservable = Observable.from(Arrays.asList("Merkury", "Wenus", "Ziemia", "Mars", "Jowisz", "Saturn", "Uran", "Neptun", "Pluton"))
.map(in -> {
System.out.println("map on: " + getCurrentThreadInfo());
return in.toUpperCase();
})
.filter(in -> {
System.out.println("filter on: " + getCurrentThreadInfo());
return in.contains("A");
})
.subscribeOn(Schedulers.from(executor));
for (int i = 0; i < 5; i++) {
Thread thread = new Thread("Thread-" + i) {
@Override
public void run() {
stringObservable
.buffer(5)
.subscribe(s -> System.out.println("Result " + s + " on: " + getCurrentThreadInfo()));
}
};
thread.start();
}
}
private static String getCurrentThreadInfo() {
return Thread.currentThread().getName() + "(" + Thread.currentThread().getId() + ")";
}
}
在创建和工作中可观察到从执行程序的三个线程之一订阅。这按预期工作。但是如何在 for 循环中观察那些动态创建的线程的结果呢?有没有办法从当前线程创建调度程序?
另外,我发现运行这段代码后,它永远不会终止,我不知道为什么? :(
【问题讨论】:
-
Android 中的主线程不一定是调用线程。这是一个重要的区别。它更相当于 Java Swing 中的 EDT。
-
当然它并不总是调用线程,但通常它被用作应该传递结果的线程。我应该更精确。
标签: java multithreading reactive-programming rx-java