天天看點

自己設計線程池,要從哪些方面考慮

1.高并發、任務執行時間段 的業務使用什麼樣的線程池

2.并發不高、任務執行時間長的的業務怎樣使用線程池

3.并發搞、業務執行時間長的業務怎樣使用線程池

線程池的本質是生産者和消費者模型,包括三要素:

  • 往線程隊列中投遞任務的生産者
  • 任務池隊列
  • 從任務池隊列取出任務執行的worker線程(消費者)

想要合理配置線程池的大小,就要分析線程池任務的特性,可以從以下幾個方面進行分析:

根據任務性質分:

  • cpu密集型
  • IO密集型
  • 混合型任務

根據任務的優先級:

根據任務的執行時間:

不同性質的任務可以交給不同配置的線程池執行:

cpu密集型任務配置盡可能小的線程,如配置cpu個數+1個線程;IO密集型任務應配置盡可能多的線程,因為IO操作不占用cpu,不要讓cpu閑下來,應加大線程的數量,如配置兩倍cpu數量+1個線程;對于混合型的任務,如果可以拆分,拆換成IO密集型和cpu密集型分别處理,如果兩種處理方式時間差距很大則沒必要拆分。

如果任務執行時間長,在worker線程數量有限的情況下,worker很快就被任務占用,導緻後續任務不能及時被處理,此時應增加worker線程數量;反過來,如果任務執行時間短,那麼worker線程數量不用太多,太多的worker線程會導緻過多的時間浪費線上程上下文切換上。

繼續閱讀