Schedulers.io()可以用于进行异步DB调用吗



Schedulers.io((可以用于进行异步DB调用吗?它会阻塞我的主线吗?

是的,它可以使用,不,它不会阻塞主线程。它的目的正是这样,快速执行阻塞IO,例如DB调用。

io阻塞主线程的唯一场景是池中所有被占用的线程;默认的Scheduler不应该发生这种情况,但如果你想控制最多启动多少个线程,你可以将自定义Scheduler设置为有限的大小,以避免ram中的线程方:

Scheduler scheduler = Schedulers.from(Executors.newFixedThreadPool(3));

判断哪种方法最适合你。第一个使事情变得更简单,并且永远不应该阻塞主线程。contra是来自默认Scheduler的克隆的攻击。如果配置得当,第二个将是最佳选择。

还有一些使用方法:

Observable.just("yourDbTable")
.flatMap(t->{ Record rec = selectFrom(t); .... })
.subscribeOn(Schedulers.io()); 

Schedulers.io()

创建并返回用于IO绑定工作的调度器。这个实现由执行器线程池支持,该线程池将随着需要。此可用于异步执行阻塞IO

实现由单线程池支持ScheduledExecutiorService实例,这些实例将尝试重用以前的由返回的工作进程使用的已启动实例Scheduler.createWorker((,否则将启动一个新的支持ScheduledExecutiorService实例

请注意,此计划程序可能会创建无限数量的工作线程,这可能导致系统速度减慢或内存不足错误。因此,用于休闲用途或实现运算符时,必须通过一次性。一次性((。

文档还建议避免计算工作

最新更新