前3个Scheduler解释的非常到位,对 computation() 和 io() 有点困惑。
java.io
)和files( java.nio.files
)吗?适用于数据库查询吗?适用于下载文件还是访问REST API? 很棒的问题,我认为文档可以提供更多细节。
io()
由无限制的线程池支持,这是你用于非计算密集型任务的东西,这些东西不会对CPU造成太大负担。因此,与文件系统的交互,与不同主机上的数据库或服务的交互就是很好的适用场景。 computation()
由有限数量的线程池支持,其大小等于可用处理器的数量。如果你试图在可用处理器之外并行安排cpu密集型工作(比如使用 newThread()
),那么当线程争夺处理器时,你就会面临线程创建开销和上下文切换开销,并且它可能会受到很大的性能影响。 computation()
CPU密集型工作,否则你将无法获得良好的CPU利用率。 io()
根据 2
中所讲,在进行计算任务时使用 io()
是很不好的,如果你 io()
并行安排了一千个计算任务,那么这千个任务中的每一个都将拥有自己的线程并争夺CPU产生的上下文切换成本。