溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java中Executor的使用方法

發(fā)布時(shí)間:2021-07-13 09:21:59 來(lái)源:億速云 閱讀:121 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“Java中Executor的使用方法”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

在上一篇我們簡(jiǎn)單的介紹了線程池的使用,雖然線程池比我們直接使用原始的線程類更加方便,但在創(chuàng)建線程池對(duì)象時(shí)對(duì)參數(shù)的設(shè)置是需要開(kāi)發(fā)人員精心考量的,否則線程池并不會(huì)實(shí)現(xiàn)我們滿意的效果。在實(shí)際的開(kāi)發(fā)中,我們用的最多的線程框架其實(shí)不是線程池而是Executor。它為我們創(chuàng)建一個(gè)線程池提供了更方便的方法。Executor是一個(gè)接口,它是Executor框架的基礎(chǔ),它使任務(wù)的提交與任務(wù)的執(zhí)行分離。底層仍然使用的是線程池。通過(guò)Executor框架的工具類Executors,可以創(chuàng)建3種類型的線程池它們分別是:FixedThreadPool、SingleThreadExecutor、CachedThreadPool。下面我們分別看一下它們之間的區(qū)別。

FixedThreadPool:可重用固定線程數(shù)的線程池。

Java中Executor的使用方法

我們從源碼中可以看出newFixedThreadPool()方法將線程池中的初始化的線程數(shù)和允許最大的線程數(shù)都設(shè)置成了參數(shù)值。也就是說(shuō)我們參數(shù)傳遞的是多少就同時(shí)有多少個(gè)線程在同時(shí)執(zhí)行。并且它又創(chuàng)建了LinkedBlockingQueue來(lái)實(shí)現(xiàn)線程池中的隊(duì)列服務(wù)。我們知道LinkedBlockingQueue是一個(gè)無(wú)界隊(duì)列,也就是說(shuō)它可以存儲(chǔ)很多個(gè)線程任務(wù),當(dāng)線程池中的并發(fā)任務(wù)大于線程池中允許的最大數(shù)時(shí),就會(huì)將任務(wù)保存到此隊(duì)列中。當(dāng)有線程執(zhí)行完畢后,線程池在從隊(duì)列中取出相應(yīng)的任務(wù)去執(zhí)行。并且我發(fā)們發(fā)現(xiàn)newFixedThreadPool()方法中已經(jīng)將keepAliveTime設(shè)置為0,目的是如果有線程執(zhí)行完任務(wù)后,要求立即終止。

SingleThreadExecutor:?jiǎn)蝹€(gè)線程的線程池。

Java中Executor的使用方法

我們看出SingleThreadExecutor()和newFixedThreadPool()方法幾乎一樣,只是設(shè)置了線程池的初始化線程數(shù)和允許的最大線程數(shù)都是1。執(zhí)行的過(guò)程和上訴的邏輯一樣。

CachedThreadPool:根據(jù)需要?jiǎng)?chuàng)建新線程的線程池。

Java中Executor的使用方法

我們看CachedThreadPool()將corePool設(shè)置為0,把maximumPoolSize設(shè)置最I(lǐng)nteger.MAX_VALUE。意思是在創(chuàng)建這個(gè)線程池時(shí),沒(méi)有初始化空閑線程,而是如果有任務(wù)添加,那么它就會(huì)創(chuàng)建一個(gè)新線程。

下面我們看一下具體的代碼。

FixedThreadPool

Java中Executor的使用方法

Java中Executor的使用方法

因?yàn)槲覀冎粍?chuàng)建了2個(gè)線程,所以這個(gè)線程池的最大并發(fā)數(shù)就是2,所以任務(wù)一任務(wù)二是先同時(shí)輸出的,任務(wù)三是后輸出的。因?yàn)槿蝿?wù)三被添加到了隊(duì)列中,只有其它任務(wù)執(zhí)行完,才會(huì)執(zhí)行隊(duì)列中的任務(wù)。

SingleThreadExecutor

Java中Executor的使用方法

Java中Executor的使用方法

Java中Executor的使用方法

因?yàn)镾ingleThreadExecutor線程池最大的并發(fā)數(shù)是1,所以當(dāng)我們提交3個(gè)任務(wù)時(shí),只有一個(gè)會(huì)執(zhí)行另外兩個(gè)會(huì)被添加到隊(duì)列中,所以執(zhí)行的結(jié)果顯示只有一個(gè)線程。

CachedThreadPool

Java中Executor的使用方法

Java中Executor的使用方法

Java中Executor的使用方法

我們知道CachedThreadPool線程池中初始化的空閑線程是0,但是它允許的最大線程數(shù)是Integer.MAX_VALUE也就相當(dāng)于無(wú)限大。所以我們?cè)谔峤蝗蝿?wù)時(shí),因?yàn)闆](méi)有超過(guò)允許的最大線程數(shù)所以線程池就會(huì)為我們創(chuàng)建一個(gè)新線程。所以任務(wù)一任務(wù)二任務(wù)三都是并行執(zhí)行的。

“Java中Executor的使用方法”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI