線程池總結

一、線程池的工作原理:

    簡單的說就是對於線程的管理,從功能上來說就是把線程的具體執行與線程的維護、統計、日誌等工作解耦。

    舉個例子,如果不使用線程池,每個任務就開啓一個新的線程,那來N的線程就會開啓N的線程,這樣的系統資源、計算能力肯定支撐不了,同時也浪費系統資源(線程的創建、銷燬都需要額外系統開銷),所以就需要有個東西來管理下,即線程池。

    做些什麼事情呢?比如正常情況下保持多少個線程開啓(核心線程數);應對大量的任務建立個池子來緩存任務,等有空餘線程了再從池子裏面領任務(任務隊列);當然了任務多到一定時候池子肯定裝不下了,那麼我們就臨時開線程緊急應對下(最大線程數);根據墨菲定律,任務可能趨近於無窮大,那麼臨時幫忙的線程哥們也不夠了...,那我們就立個規矩去安排這種情況怎麼處理(拒絕處理策略);當任務完成的差不多的時候,就不需要臨時幫忙的線程了,就要銷燬線程到正常情況下的線程數,比如一分鐘都沒任務就可以銷燬了(空閒線程的存活時間)。PS:好吧,臨時工挺悲哀的。。。

 

二、相關JAVA類:

     1、ThreadPoolExecutor,線程池的類。

     2、Executors,創建的線程池的工廠工具類。

             主要涉及到以下接口:

                  (1)newFixedThreadPool,初始化一個指定線程數的線程池,換句話說能夠控制併發數,大多數場景都使用這種;

                 (2)newCachedThreadPool,初始化一個可以緩存線程的線程池,默認緩存60s,核心線程數爲0,最大線程數可達到Integer.MAX_VALUE;使用場景:對於大量短暫異步任務的程序來說,使用該線程池能夠大大提高性能 

                  (3)newSingleThreadExecutor,初始化的線程池中只有一個線程,如果該線程異常結束,會重新創建一個新的線程繼續執行任務,唯一的線程可以保證所提交任務的順序執行。

                  (4)newScheduledThreadPool,初始化的線程池可以在指定的時間內週期性的執行所提交的任務,在實際的業務場景中可以使用該線程池定期的同步數據。

 

三、線程池大小的合理配置:

    業內比較通用的方法,具體可再根據機子性能、具體任務調整。

    一般需要根據任務的類型來配置線程池大小:

  如果是CPU密集型任務,就需要儘量壓榨CPU,參考值可以設爲 N(CPU核數)+1,減少線程上下文的切換

  如果是IO密集型任務,參考值可以設置爲2*N(CPU核數)

 

四、線程池使用場景:

    1、消息通知、發郵件、記錄日誌等等;

    2、秒殺;    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章