RxJava調度器的選擇

前提:

在RxJava中有5種不一樣的調度程序可供選擇:html

  1. immediate():建立並返回一個在當前線程上當即執行工做的Scheduler。
  2. trampoline():建立並返回一個Scheduler ,該Scheduler 所在線程並不會當即工做,而是要等待咱們所設定的等待時間結束後才能夠執行(默認爲0),固然,這個延時設置是要設定在Runnable實現內部。還有一點就是全部任務要添加到一個隊列中,而後依次執行便可。
  3. newThread():建立並返回一個Scheduler,爲每一個任務建立一個新的Thread。
  4. computation():建立並返回用於計算工做的Scheduler。它能夠用於事件循環,處理回調和其餘計算工做。注意不要使用該Scheduler執行IO類型的工做,對此,咱們能夠使用io() 代替。
  5. io() :建立並返回一個用於IO類型工做的Scheduler。該實現維護了一個Executor線程池,該線程池可根據須要增加。該Scheduler可用於異步執行阻塞IO。不要使用該Scheduler執行計算任務。

問題:

前3個Scheduler解釋的很是到位,對computation()io() 有點困惑。java

  1. 究竟什麼是「IO-bound work」?它適用於處理streams(java.io)和files(java.nio.files)嗎?適用於數據庫查詢嗎?適用於下載文件仍是訪問REST API?
  2. computation()newThread() 有什麼不一樣之處?
  3. 爲何在進行IO任務時調用computation() 會很糟糕?
  4. 爲何在進行計算任務時調用io() 會很糟糕?

答案:

很棒的問題,我認爲文檔能夠提供更多細節。react

  1. io()由無限制線程數量的線程池支持,用於執行非計算密集型任務,這些任務不會對CPU形成太大負擔(好比主板上的南北橋芯片,南橋芯片主要負責軟驅、硬盤、鍵盤以及附加卡的數據交換)。所以,與文件系統的交互,與不一樣主機上的數據庫或服務的交互就是很好的適用場景。
  2. computation()由有限數量的線程池支持,其大小等於可用處理器的數量。若是你試圖在可用處理器以外並行安排cpu密集型工做(好比使用newThread()),那麼當線程爭奪處理器時,你就會面臨線程建立開銷和上下文切換開銷,而且它可能會受到很大的性能影響。
  3. 最好只留下computation()CPU密集型工做,不然你將沒法得到良好的CPU利用率。
  4. io()根據2中所講,在進行計算任務時使用io()是很很差的,若是你io()並行安排了一千個計算任務,那麼這千個任務中的每個都將擁有本身的線程並爭奪CPU產生的上下文切換成本。

本文配套拓展視頻講解:數據庫

Rxjava問題集之RxJava調度器的選擇01異步

Rxjava問題集之RxJava調度器的選擇02ide

相關文章
相關標籤/搜索