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