我试图了解Observable的执行方式,但似乎无法使这个简单的代码正常工作。
1
public class RxJavaExample {
public static void main(String[] args) {
Observable<String> hello = Observable.fromCallable(() ->
getHello()).subscribeOn(Schedulers.newThread());
hello.subscribe();
System.out.println("End of main!");
}
public static String getHello() {
System.out.println("Hello called in " +
Thread.currentThread().getName());
return "Hello";
}
}
是否应该执行hello.subscribe()
?
答案 0 :(得分:2)
这是因为您的主线程在后台线程到达getHello
之前完成了。退出前,请尝试在Thread.sleep(5000)
方法中添加main
。
或者,等到您的订阅的onCompleted
被调用。
编辑:程序终止的原因是因为RxJava产生了daemon个线程。在寻找良好资源的过程中,我还发现了this个问题,也可能回答了这个问题。
答案 1 :(得分:0)
@sfiss是正确的,它的工作与您期望的一样:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import io.reactivex.Observable;
import io.reactivex.schedulers.Schedulers;
public class RxJavaExample {
public static void main(String[] args) throws InterruptedException {
ExecutorService exec = Executors.newCachedThreadPool();
Observable<String> hello = Observable.fromCallable(() -> getHello())
.subscribeOn(Schedulers.from(exec));
hello.subscribe();
System.out.println("End of main!");
exec.shutdown();
exec.awaitTermination(10, TimeUnit.SECONDS);
}
public static String getHello() {
System.out.println("Hello called in " + Thread.currentThread().getName());
return "Hello";
}
}
具有以下输出:
End of main!
Hello called in pool-1-thread-1
答案 2 :(得分:-1)
可能是您对Thread和Observables感到困惑,
我过去使用Observables的方式是在Minecraft插件上使用计时器,我有一个每分钟触发一次的事件。
public class TimerHandler extends Observable implements Runnable{
@Override
public void run() {
this.setChanged();
this.notifyObservers();
}
}
因此这会每分钟触发一次,然后将事件添加到计时器队列中,您只需订阅可观察到的含义,即每分钟都会触发订阅的呼叫。
public class PlotTimer implements Observer {
@Override
public void update(Observable o, Object arg) {
......
要订阅,我会拨打以下电话
getServer().getScheduler().scheduleAsyncRepeatingTask(this,timerHandler,1200,1200);
timerHandler.addObserver(new PayDayTimer());
timerHandler.addObserver(new ProfileTimer());
timerHandler.addObserver(new PlotTimer());