1. 程式人生 > Android開發 >YYDispatchQueuePool原始碼筆記

YYDispatchQueuePool原始碼筆記

工具作者在實際開發中,由於開了很多執行緒去做非同步繪製、下載等工作,而且有的執行緒可能因為資源鎖等待的原因,可能導致開更多的執行緒。當執行緒過多時,執行緒佔用了過多資源,可能導致主執行緒受影響,出現卡頓問題

而iOS框架中有最大併發數概念的目測只有NSOpeartionQueue了,但GCD的程式碼卻無法使用該特性

於是寫了該工具,可以方便地建立一個佇列池,類似於執行緒池的概念,可以避免開闢執行緒過多的問題

Feature

  • 內部使用序列佇列來管理執行緒
  • 最多序列佇列數不超過32個,所以執行緒數也不會超過該值
  • 提供兩種獲取佇列池的方式
    • 全域性方法,獲取一個佇列池
    • 自己建立一個佇列池管理類,管理序列佇列

原理

核心工作就兩步驟

  1. 根據qos、當前CPU情況以及所需的輸入建立多個序列佇列
    • 佇列資訊儲存在YYDispatchContext結構體中
  2. 結構體中有一個counter,每次呼叫YYDispatchQueueGetForQOScounter加一,同時使用counter % queueCount作為下標來輪詢地到context中獲取一個queue

YYDispatchContext結構體如下

typedef struct {
    const char *name;
    void **queues;
    uint32_t queueCount;
    int32_t counter;
} YYDispatchContext;
複製程式碼

參考