首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Schedulers.trampoline() inRxJava

如何使用Schedulers.trampoline() inRxJava
EN

Stack Overflow用户
提问于 2016-10-25 07:33:23
回答 4查看 8.8K关注 0票数 14

由于Schedulers.trampoline()使作业在当前线程上工作,所以我无法找到使用Schedulers.trampoline()的情况与没有调度程序设置的情况之间的区别。

使用Schedulers.trampoline()

代码语言:javascript
复制
Observable.from(1, 2, 3)
    .observeOn(Schedulers.trampoline())
    .subscribe(System.out::println)

不使用调度程序:

代码语言:javascript
复制
Observable.from(1, 2, 3)
    .subscribe(System.out::println)

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-10-25 08:30:01

您将不会从使用观察者/ subscribeOn中的调度程序中获得任何好处。您可以使用调度程序中的工作人员来安排下班后的工作。

请看一下这个例子。我正在使用RxJava2-RC5。

代码语言:javascript
复制
@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);
}

输出:

开始: r2结束: r2开始: r1结束: r1

如果您是递归地调度工作,则蹦床工人会派上用场,因为您不会使用get和StackOverFlow。

这个例子被从introtorx (SchedulingAndThreading.html)转换为SchedulingAndThreading.html

票数 13
EN

Stack Overflow用户

发布于 2018-02-03 02:33:06

晚到派对了,但从医生那里:

在2.x中没有立即调度程序。它经常被误用,也没有正确地实现Scheduler规范;它包含阻塞睡眠以延迟动作,并且根本不支持递归调度。使用Schedulers.trampoline()代替。

这意味着你接受的答案可能是错误的。请参见Coding/rxjava-schedulers-trampoline-use-cases-283f6649cbf,它说:

在蹦床()上订阅的所有作业都将一个一个地排队并执行。

实际上显示了一个例子,如

代码语言:javascript
复制
 .subscribeOn(Schedulers.trampoline())
票数 3
EN

Stack Overflow用户

发布于 2018-08-09 18:20:58

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

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

如果在主线程上运行代码,则结果如下所示:

代码语言:javascript
复制
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")永远也联系不上。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40233956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档