如何使用Schedulers.trampoline()在rxjava



由于Schedulers.trampoline()使作业在当前线程上工作,我找不到Schedulers.trampoline()和没有Schedulers设置的情况之间的区别。

使用Schedulers.trampoline():

Observable.from(1, 2, 3)
    .observeOn(Schedulers.trampoline())
    .subscribe(System.out::println)

不使用调度器:

Observable.from(1, 2, 3)
    .subscribe(System.out::println)

我认为以上代码的作用是相同的。我真的很想知道为什么Schedulers.trampoline()存在于RxJava的API中。

在什么情况下,我应该使用Schedulers.trampoline()

在observeOn/subscribeOn中使用调度器不会获得任何好处。您可以使用调度程序中的Worker来安排下班后的工作。

请看下面的例子。我使用的是RxJava2-RC5

@Test
public void trampoline() throws Exception {
        Scheduler scheduler = Schedulers.trampoline();
        Scheduler.Worker worker = scheduler.createWorker();
        Runnable r1 = () -> {
            System.out.println("Start: r1");
            System.out.println("End: r1");
        };
        Runnable r2 = () -> {
            System.out.println("Start: r2");
            worker.schedule(r1);
            System.out.println("End: r2");
        };
        worker.schedule(r2);
}
输出:

Start: r2 End: r2 Start: r1 End: r1

如果你递归地调度工作,蹦床工人会派上用场,因为你不会得到和StackOverFlow。

这个例子是从introtorx (http://www.introtorx.com/content/v1.0.10621.0/15_SchedulingAndThreading.html)转换成RxJava的

Schedulers.trampoline()还有另一种用法,请查看以下内容:

println("Current thread: ${Thread.currentThread()}")
Observable.interval(500, TimeUnit.MILLISECONDS, Schedulers.trampoline())
    .subscribe{
        println("$it thread: ${Thread.currentThread()}")
    }
println("This never will be reached")

如果在主线程上运行代码,那么结果将是这样的:

Current thread: Thread[main,5,main]
0 thread: Thread[main,5,main]
1 thread: Thread[main,5,main]
2 thread: Thread[main,5,main]
3 thread: Thread[main,5,main]
4 thread: Thread[main,5,main]
5 thread: Thread[main,5,main]
...

println("This never will be reached")将永远不会到达。

姗姗来迟,但来自文档:

即时调度程序在2.x中不存在。这经常发生误用并且没有正确实现Scheduler规范无论如何;它包含阻止睡眠延迟动作,但没有完全不支持递归调度。使用Schedulers.trampoline ()相反。

这意味着你接受的答案可能是错误的。看到https://medium.com/@I_Love_Coding/rxjava-schedulers-trampoline-use-cases-283f6649cbf说:

所有订阅trampoline()的作业将被排队并执行一个接一个。

显示了一个像

这样的例子
 .subscribeOn(Schedulers.trampoline())

对于测试也很方便。在这种情况下,您不直接使用调度器,而是将一个对象(或提供程序)注入(或通过构造函数设置或传入类)到您的类中,该对象(或提供程序)包含所需的调度器。在subscribeOnobserveOn中使用这个对象保存调度程序。当测试时,你注入(或设置或手动)trampoline(),这样你的测试都在同一个线程上运行。

相关内容

  • 没有找到相关文章

最新更新