immediate():创建并返回一个调度器,该调度器立即在当前线程上执行工作。
trampoline():创建并返回一个调度器,该调度器将工作排队在当前线程上,在当前工作完成后执行。
newThread():创建并返回一个调度器,每个工作单元都会创建一个新线程。
computation():创建并返回一个用于计算工作的调度器。这可用于事件循环、处理回调和其他计算工作。请勿在此调度器上执行IO绑定工作。请改用Schedulers.io()。
io():创建并返回一个用于IO绑定工作的调度器。 实现由一个Executor线程池支持,该线程池将根据需要增长。这可用于异步执行阻塞IO。请勿在此调度器上执行计算工作。请改用Schedulers.computation()。
问题:
前三个调度器相当容易理解,但是我对计算和io有些困惑。1. “IO-bound work”究竟是什么?它用于处理流(
java.io
)和文件(java.nio.files
)吗?它用于数据库查询吗?它用于下载文件或访问REST API吗?2. computation()和newThread()有何不同?所有的computation()调用都在单个(后台)线程上执行,而不是每次都在新的(后台)线程上执行吗?
3. 在进行IO工作时为什么不能调用computation()?
4. 在进行计算工作时为什么不能调用io()?
computation()
函数上设置timeout
会阻塞线程,但事实并非如此。在内部,computation()
使用了一个ScheduledExecutorService
,因此延迟的操作不会阻塞线程。鉴于这个事实,使用computation()
是一个好主意,因为如果它在另一个线程上执行,我们将面临线程切换成本。 - Dave Moten