内容简介:在RxJava中有前3个Scheduler解释的非常到位,对很棒的问题,我认为文档可以提供更多细节。
在RxJava中有 5种不同的调度程序 可供选择:
- immediate() :创建并返回一个在当前线程上立即执行工作的Scheduler。
- trampoline() :创建并返回一个Scheduler ,该Scheduler 所在线程并不会立即工作,而是要等待我们所设定的等待时间结束后才可以执行(默认为0),当然,这个延时设置是要设定在Runnable实现内部。还有一点就是所有任务要添加到一个队列中,然后依次执行即可。
- newThread() :创建并返回一个Scheduler,为每个任务创建一个新的Thread。
- computation() :创建并返回用于计算工作的Scheduler。它可以用于事件循环,处理回调和其他计算工作。注意不要使用该Scheduler执行IO类型的工作,对此,我们可以使用 io() 代替。
- io() :创建并返回一个用于IO类型工作的Scheduler。该实现维护了一个Executor线程池,该线程池可根据需要增长。该Scheduler可用于异步执行阻塞IO。不要使用该Scheduler执行计算任务。
问题:
前3个Scheduler解释的非常到位,对 computation() 和 io() 有点困惑。
-
究竟什么是“IO-bound work”?它适用于处理streams(
java.io
)和files(java.nio.files
)吗?适用于数据库查询吗?适用于下载文件还是访问REST API? - computation() 与 newThread() 有什么不同之处?
- 为什么在进行IO任务时调用 computation() 会很糟糕?
-
为什么在进行计算任务时调用 io()
会很糟糕?
答案:
很棒的问题,我认为文档可以提供更多细节。
-
io()
由无限制线程数量的线程池支持,用于执行非计算密集型任务,这些任务不会对CPU造成太大负担(比如主板上的南北桥芯片,南桥芯片主要负责软驱、硬盘、键盘以及附加卡的数据交换)。因此,与文件系统的交互,与不同主机上的数据库或服务的交互就是很好的适用场景。 -
computation()
由有限数量的线程池支持,其大小等于可用处理器的数量。如果你试图在可用处理器之外并行安排cpu密集型工作(比如使用newThread()
),那么当线程争夺处理器时,你就会面临线程创建开销和上下文切换开销,并且它可能会受到很大的性能影响。 -
最好只留下
computation()
CPU密集型工作,否则你将无法获得良好的CPU利用率。 -
io()
根据 2 中所讲,在进行计算任务时使用io()
是很不好的,如果你io()
并行安排了一千个计算任务,那么这千个任务中的每一个都将拥有自己的线程并争夺CPU产生的上下文切换成本。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 008.kubernets的调度系统之标签选择器
- 理解golang调度之一 :操作系统调度
- 理解golang调度之二 :Go调度器
- Golang 源码学习调度逻辑(三):工作线程的执行流程与调度循环
- Node.js CPU调度优化(多服务器多核心分配调度)
- Hadoop 容器调度器与公平调度器原理和实践深入剖析-Hadoop商业环境实战
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
人机交互:以用户为中心的设计和评估
董建明、傅利民、[美]沙尔文迪 / 清华大学出版社 / 2003-9-1 / 28.00
本书综述部分介绍了与“用户为中心的设计和评估”方法相关的背景知识及发展概况。其后,分3篇分别介绍了解用户、用户界在设计和可用性评估的内容及一些相关的研究专题。最后,第11章讨论了在组织中实施以用户为中心的设计的专题。本书主要面向的读者包括:软件或网站的设计人员。同时本书也可成为“现代人因工程学”及“以用户为中心的设计”的教材,还可作为软件或网站公司经理的提高用户满意度或提升公司形象的手册。一起来看看 《人机交互:以用户为中心的设计和评估》 这本书的介绍吧!