上節(jié),我們初步探討了Java并發(fā)包中的任務(wù)執(zhí)行服務(wù),實際中,任務(wù)執(zhí)行服務(wù)的主要實現(xiàn)機制是線程池,本節(jié),我們就來探討線程池。
基本概念
線程池,顧名思義,就是一個線程的池子,里面有若干線程,它們的目的就是執(zhí)行提交給線程池的任務(wù),執(zhí)行完一個任務(wù)后不會退出,而是繼續(xù)等待或執(zhí)行新任務(wù)。線程池主要由兩個概念組成,一個是任務(wù)隊列,另一個是工作者線程,工作者線程主體就是一個循環(huán),循環(huán)從隊列中接受任務(wù)并執(zhí)行,任務(wù)隊列保存待執(zhí)行的任務(wù)。
線程池的概念類似于生活中的一些排隊場景,比如在火車站排隊購票、在醫(yī)院排隊掛號、在銀行排隊辦理業(yè)務(wù)等,一般都由若干個窗口提供服務(wù),這些服務(wù)窗口類似于工作者線程,而隊列的概念是類似的,只是,在現(xiàn)實場景中,每個窗口經(jīng)常有一個單獨的隊列,這種排隊難以公平,隨著信息化的發(fā)展,越來越多的排隊場合使用虛擬的統(tǒng)一隊列,一般都是先拿一個排隊號,然后按號依次服務(wù)。
線程池的優(yōu)點是顯而易見的:
它可以重用線程,避免線程創(chuàng)建的開銷