关闭。这个问题需要细节或清晰。它目前不接受答案。**想改进这个问题吗?**通过编辑这个帖子来添加细节并澄清问题。
14天前关门了。改进这个问题schedulers.io()可以用来进行异步db调用吗?它会挡住我的主线吗?
wnvonmuf1#
是的,它可以被使用,不,它不会阻塞你的主线程。它的目的正是这样的,以异步方式执行阻塞io,例如db调用。唯一的情况是 io 阻塞主线程将是池中被占用的所有线程;默认的调度程序不应该发生这种情况,但是如果您想控制最多启动多少个线程,可以设置您的自定义调度程序 Scheduler 为了避免内存中的线程聚会,请使用有限的大小:
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()来释放工作示例。 文件还建议避免计算工作。
1条答案
按热度按时间wnvonmuf1#
是的,它可以被使用,不,它不会阻塞你的主线程。它的目的正是这样的,以异步方式执行阻塞io,例如db调用。
唯一的情况是
io
阻塞主线程将是池中被占用的所有线程;默认的调度程序不应该发生这种情况,但是如果您想控制最多启动多少个线程,可以设置您的自定义调度程序Scheduler
为了避免内存中的线程聚会,请使用有限的大小:判断哪种方法最适合你。第一种方法使事情更简单,并且永远不要阻塞主线程。反向攻击是来自默认调度程序的克隆的攻击。第二个,如果配置得当,将是最佳选择。
以及一些使用方法: