schedulers.io()可以用来进行异步db调用吗?

nwo49xxi  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(374)

关闭。这个问题需要细节或清晰。它目前不接受答案。
**想改进这个问题吗?**通过编辑这个帖子来添加细节并澄清问题。

14天前关门了。
改进这个问题
schedulers.io()可以用来进行异步db调用吗?它会挡住我的主线吗?

wnvonmuf

wnvonmuf1#

是的,它可以被使用,不,它不会阻塞你的主线程。它的目的正是这样的,以异步方式执行阻塞io,例如db调用。
唯一的情况是 io 阻塞主线程将是池中被占用的所有线程;默认的调度程序不应该发生这种情况,但是如果您想控制最多启动多少个线程,可以设置您的自定义调度程序 Scheduler 为了避免内存中的线程聚会,请使用有限的大小:

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

判断哪种方法最适合你。第一种方法使事情更简单,并且永远不要阻塞主线程。反向攻击是来自默认调度程序的克隆的攻击。第二个,如果配置得当,将是最佳选择。
以及一些使用方法:

Observable.just("yourDbTable")
         .flatMap(t->{ Record rec = selectFrom(t); .... })
         .subscribeOn(Schedulers.io());
``` `Schedulers.io()` 创建并返回用于io绑定工作的计划程序。实现由一个执行器线程池支持,该线程池将根据需要增长。这可用于异步执行阻塞io。
实现由一个单线程scheduledexecutorservice示例池支持,这些示例将尝试重用scheduler.createworker()返回的worker使用的以前启动的示例,否则将启动一个新的支持scheduledexecutorservice示例。
请注意,此计划程序可能会创建无限数量的工作线程,从而导致系统减速或outofmemoryerror。因此,对于临时使用或在实现操作符时,必须通过disposable.dispose()来释放工作示例。
文件还建议避免计算工作。

相关问题