java創(chuàng)建線程池的方式有幾種 Java線程池?
Java線程池?多線程就是合理分配計(jì)算機(jī)資源,創(chuàng)建不同的線程來處理不同的任務(wù)。然而,對于計(jì)算機(jī)來說,創(chuàng)建一個(gè)線程或銷毀一個(gè)線程是很昂貴的。有時(shí)候有很多事情需要同時(shí)處理,所以我們需要頻繁地創(chuàng)建和銷毀線程
Java線程池?
多線程就是合理分配計(jì)算機(jī)資源,創(chuàng)建不同的線程來處理不同的任務(wù)。然而,對于計(jì)算機(jī)來說,創(chuàng)建一個(gè)線程或銷毀一個(gè)線程是很昂貴的。有時(shí)候有很多事情需要同時(shí)處理,所以我們需要頻繁地創(chuàng)建和銷毀線程,這需要花費(fèi)很多時(shí)間。要解決這個(gè)問題,可以參考線程池的概念。
所謂線程池,就是集中管理線程。需要線程時(shí),可以從線程池中獲取空閑線程,這樣可以減少頻繁的創(chuàng)建和銷毀線程,節(jié)省大量時(shí)間,減少很多不必要的操作。
java中提供了ThreadPoolExecutor類來管理線程。此類從AbstractExecutorService繼承,后者實(shí)現(xiàn)ExecutorService接口。我們可以使用ThreadPoolExecutor來創(chuàng)建線程池。
什么是線程池,如何使用,為什么要用?
首先,線程池的作用:
線程池的作用是限制系統(tǒng)中執(zhí)行線程的數(shù)量。
根據(jù)系統(tǒng)的環(huán)境,可以自動(dòng)或手動(dòng)設(shè)置線程數(shù)量,以達(dá)到最佳運(yùn)行效果;少了浪費(fèi)系統(tǒng)資源,多了造成系統(tǒng)擁塞,效率低下。使用線程池控制線程數(shù)量,其他線程排隊(duì)等待。在一個(gè)任務(wù)被執(zhí)行后,從隊(duì)列中取出前面的任務(wù)并開始執(zhí)行。如果隊(duì)列中沒有正在等待的進(jìn)程,那么線程池的這個(gè)資源正在等待。當(dāng)一個(gè)新任務(wù)需要運(yùn)行時(shí),如果線程池中有等待的工作線程,就可以開始運(yùn)行;否則,進(jìn)入等待隊(duì)列。
二、如何使用:
配置一個(gè)線程池比較復(fù)雜,尤其是如果不清楚線程池的原理,很有可能配置的線程池不是最優(yōu)的,所以在Executors類中提供了一些靜態(tài)工廠來生成一些常用的線程池。
創(chuàng)建單線程線程池。這個(gè)線程池中只有一個(gè)線程在工作,相當(dāng)于單個(gè)線程串行執(zhí)行所有任務(wù)。如果這個(gè)唯一的線程由于異常而結(jié)束,一個(gè)新的線程將取代它。這個(gè)線程池確保所有任務(wù)按照提交的順序執(zhí)行。
創(chuàng)建一個(gè)固定大小的線程池。每次提交任務(wù)時(shí)創(chuàng)建一個(gè)線程,直到線程達(dá)到線程池的最大大小。一旦線程池的大小達(dá)到最大值,它將保持不變。如果一個(gè)線程由于執(zhí)行異常而結(jié)束,線程池將被一個(gè)新線程補(bǔ)充。
?
1.創(chuàng)建和銷毀線程的數(shù)量減少了,每個(gè)工作線程可以重用來執(zhí)行多個(gè)任務(wù)。2.根據(jù)系統(tǒng) s的承載能力,可以調(diào)整線程池中工作線程的數(shù)量,防止服務(wù)器因內(nèi)存消耗過大而耗盡(每個(gè)線程需要1MB左右的內(nèi)存,打開的線程越多,消耗的內(nèi)存越多,最后崩潰)。
Java中線程池的頂層接口是Executor,但嚴(yán)格來說Executor并不是線程池,只是一個(gè)執(zhí)行線程的工具。真正的線程池接口是ExecutorService。