由于Schedulers.trampoline()使作业在当前线程上工作,所以我无法找到使用Schedulers.trampoline()的情况与没有调度程序设置的情况之间的区别。
使用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()
发布于 2016-10-25 08:30:01
您将不会从使用观察者/ subscribeOn中的调度程序中获得任何好处。您可以使用调度程序中的工作人员来安排下班后的工作。
请看一下这个例子。我正在使用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);
}输出:
开始: r2结束: r2开始: r1结束: r1
如果您是递归地调度工作,则蹦床工人会派上用场,因为您不会使用get和StackOverFlow。
这个例子被从introtorx (SchedulingAndThreading.html)转换为SchedulingAndThreading.html。
发布于 2018-02-03 02:33:06
晚到派对了,但从医生那里:
在2.x中没有立即调度程序。它经常被误用,也没有正确地实现Scheduler规范;它包含阻塞睡眠以延迟动作,并且根本不支持递归调度。使用Schedulers.trampoline()代替。
这意味着你接受的答案可能是错误的。请参见Coding/rxjava-schedulers-trampoline-use-cases-283f6649cbf,它说:
在蹦床()上订阅的所有作业都将一个一个地排队并执行。
实际上显示了一个例子,如
.subscribeOn(Schedulers.trampoline())发布于 2018-08-09 18:20:58
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")永远也联系不上。
https://stackoverflow.com/questions/40233956
复制相似问题