RxJava中默认Observable是否运行在计算线程?代码场景咨询
RxJava interval默认线程疑问解答
嘿,这个问题问到点子上了,刚好涉及RxJava里一个容易被忽略的默认行为~
先直接给结论:这段代码的事件发射和消费逻辑都会在计算线程(computation thread)执行,和主线程没啥关系,哪怕你没调用subscribeOn()。
为啥会这样?核心原因在于Observable.interval()这个操作符本身的设计:它默认就会使用Schedulers.computation()线程池来调度事件发射,不需要你额外指定subscribeOn()。
拆解下你的代码逻辑:
- 你创建的
secondIntervalsObservable,会在计算线程上每隔1秒生成一个递增的Long数值 subscribe()里的打印逻辑,默认会跟随上游Observable的线程,所以也会在计算线程中执行- 主线程只是通过
sleep(5000)被阻塞了5秒,给Observable留出了发射事件的时间,本身并没有参与事件的生成或消费
如果想要验证这个结论,你可以在订阅的lambda里加上线程名称打印,比如:
secondIntervals.subscribe(s -> System.out.println(s + " 线程:" + Thread.currentThread().getName()));
运行后你会看到类似0 线程:RxComputationThreadPool-1这样的输出,明确显示是计算线程在干活。
另外补充个小知识点:如果是普通的Observable(比如Observable.just()),它默认会在当前线程执行,但像interval、timer这类涉及定时/延迟的操作符,RxJava为了不阻塞当前线程,都默认绑定了computation线程。
你的原代码如下:
import io.reactivex.Observable; import java.util.concurrent.TimeUnit; public class Launcher { public static void main(String[] args) { Observable<Long> secondIntervals = Observable.interval(1, TimeUnit.SECONDS); secondIntervals.subscribe(s -> System.out.println(s)); /* Hold main thread for 5 seconds so Observable above has chance to fire */ sleep(5000); } public static void sleep(long millis) { try { Thread.sleep(millis); } catch (InterruptedException e) { e.printStackTrace(); } } }
内容的提问来源于stack exchange,提问作者sagar suri
相关产品推荐
相关产品推荐

