線程池作為java開發者必備技能,在日常開發中十分常見,所以從這一節開始我們介紹線程池。
今天的內容有兩點,第一點,為什么要使用線程池?第二點,什么是線程池?
首先來看第一點,為什么要使用線程池?
在沒有使用線程池之前,我們是如何執行任務的?這是一個任務,任務內容是輸出當前線程名稱,接下來我們來執行該任務。
首先將任務創建出來,然后創建一個線程,接着將任務傳遞給線程,緊接着啟動線程,任務就開始執行了。程序輸出thread-0,
我們發現一個線程它只能執行一個任務,不能連續執行任務。例如這里有三個任務,它沒法連續執行,沒有上述這種寫法,
只能在創建兩個線程去執行另外兩個任務,程序分別輸出三個線程的名稱,這些線程執行。完任務以后就銷毀了,如果再有任務時,則需要重新創建線程,這也暴露了一個問題,線程不能復用。
重復創建和銷毀線程耗時耗資源,如果能復用就好了,復用的好處就是省時省資源。
下面我們就來看看線程池是如何執行任務的,還是這三個任務創建只有一個線程的線程池,
這個線程池里面只有一個線程,這個不是重點,重點是他里面的這個線程可以復用調用他的execute的方法,將需要執行的任務提交給線程池,任務提交以后,線程池會自動分配線程去執行提交過來的任務,最后記得調用它的shutdown方法關閉線程池,當線程池中的任務全部執行完畢以后,線程池則會關閉。線程池關閉以后無法再提交任務,程序輸出三個名稱一樣的線程,說明一個縣城執行了三個任務。足以證明線程得到復用。
對比線程,線程池的好處有很多,這里列舉三個,
第一個,降低資源消耗,通過重復利用已創建的線程,降低線程創建和銷毀造成的消耗。
第二個,提高響應速度,當有任務時,任務可以不需要等待線程創建就能立即執行。
第三個,提高現成的可管理性。線程是稀缺資源,如果無限制的創建,不僅會消耗系統資源,還會降低系統的穩定性。使用線程池可以進行統一的分配、調優和監控。
什么是線程池?
介紹完為什么要使用線程池,接下來我們再來看看什么是線程池。線程池是一種基於池化思想管理現成的工具。
在沒有現成值之前,當有任務需要執行時,
我們會創建一個線程,
然后將任務傳遞給線程,
並且一個線程只能執行一個任務,如果還有任務,我們就只能再創建一個線程去執行它,
當任務執行完時,線程就銷毀了。
重復創建和銷毀線程是一件很耗時耗資源的是,如果線程能復用,那么就減少很多不必要的消耗,於是線程池就孕而生了。
事先將線程創建后,當有任務需要執行時提交給線程池,
線程池分配線程去執行,
有再多的任務也不怕。線程池中的線程能復用,
執行完一個任務再接着執行其他任務。
當所有任務都執行完時,
我們可以選擇關閉線程池,
也可以選擇等待接收任務。
線程池的英文叫做threadpool,thread線程的意思,Pool池的意思,Threadpool線程池,這是線程池的核心UML類圖。
這里面的每一個元素后續章節都會講到,最后總結一下本節的內容,本節介紹了為什么要使用線程池和什么是線程池,這里就不再贅述了。在實際開發中,線程池用的非常多,希望大家可以掌握它。下一節我們將介紹如何創建線程池,
本節的代碼地址如下,大家有需要的話可以前去查看。