1)提升性能。建立和消耗對象費時費cpu資源
2)防止記憶體過度消耗。控制活動線程的數量,防止并發線程過多。
我們來看一下線程池的簡單的構造
使用上面的方式建立線程池的話,我們需要配置一堆東西,非常麻煩,是以我們不建議這麼使用。而是推薦使用executors的工廠方法來建立線程池,executors類是官方提供的一個工廠類,它裡面封裝好了衆多功能不一樣的線程池。下面就介紹幾個常用的線程池。
該方法傳回一個固定線程數量的線程池,該線程池中的線程數量始終不變,即不會再建立新的線程,也不會銷毀已經建立好的線程,自始自終都是那幾個固定的線程在工作,是以該線程池可以控制線程的最大并發數。
栗子:假如有一個新任務送出時,線程池中如果有空閑的線程則立即使用空閑線程來處理任務,如果沒有,則會把這個新任務存在一個任務隊列中,一旦有線程空閑了,則按fifo方式處理任務隊列中的任務。
該方法傳回一個可以根據實際情況調整線程池中線程的數量的線程池。即該線程池中的線程數量不确定,是根據實際情況動态調整的。
栗子:假如該線程池中的所有線程都正在工作,而此時有新任務送出,那麼将會建立新的線程去處理該任務,而此時假如之前有一些線程完成了任務,現在又有新任務送出,那麼将不會建立新線程去處理,而是複用空閑的線程去處理新任務。那麼此時有人有疑問了,那這樣來說該線程池的線程豈不是會越集越多?其實并不會,因為線程池中的線程都有一個“保持活動時間”的參數,通過配置它,如果線程池中的空閑線程的空閑時間超過該“儲存活動時間”則立刻停止該線程,而該線程池預設的“保持活動時間”為60s。
該方法傳回一個隻有一個線程的線程池,即每次隻能執行一個線程任務,多餘的任務會儲存到一個任務隊列中,等待這一個線程空閑,當這個線程空閑了再按fifo方式順序執行任務隊列中的任務。
該方法傳回一個可以控制線程池内線程定時或周期性執行某任務的線程池。
android中常用的線程池就上面的四種,其實在java中還有一種常見的線程池(newsinglethreadscheduledexecutor),其實上面的線程池對于我們開發已經是足夠了,不過有時候上面的仍然不能滿足我們,這時候我們就需要自定義不同功能的線程池。上面我們也說了線程池功能的不同歸根到底還是内部的blockingqueue實作不同,是以,我們要實作我們自己相要的線程池,就必須從blockingqueue的實作上做手腳。
那麼我們接下來就用priorityblockingqueue來實作一個fifo的線程池。