溫馨提示×

溫馨提示×

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

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

線程池的種類,區(qū)別和使用場景是什么

發(fā)布時間:2022-01-04 17:00:50 來源:億速云 閱讀:91 作者:柒染 欄目:大數(shù)據(jù)

這篇文章將為大家詳細(xì)講解有關(guān)線程池的種類,區(qū)別和使用場景是什么,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

一個線程從被提交(submit)到執(zhí)行共經(jīng)歷以下流程:

線程池判斷核心線程池里是的線程是否都在執(zhí)行任務(wù),如果不是,則創(chuàng)建一個新的工作線程來執(zhí)行任務(wù)。如果核心線程池里的線程都在執(zhí)行任務(wù),則進(jìn)入下一個流程

線程池判斷工作隊(duì)列是否已滿。如果工作隊(duì)列沒有滿,則將新提交的任務(wù)儲存在這個工作隊(duì)列里。如果工作隊(duì)列滿了,則進(jìn)入下一個流程。

線程池判斷其內(nèi)部線程是否都處于工作狀態(tài)。如果沒有,則創(chuàng)建一個新的工作線程來執(zhí)行任務(wù)。如果已滿了,則交給飽和策略來處理這個任務(wù)。

任務(wù)拒接策略?

 有4種內(nèi)置的實(shí)現(xiàn)策略和一個用戶自定義拒絕策略。

AbortPolicy       為java線程池默認(rèn)的阻塞策略,不執(zhí)行此任務(wù),而且直接拋出一個運(yùn)行時異常,切記ThreadPoolExecutor.execute需要try catch,否則程序會直接退出。 

DiscardPolicy        直接拋棄,任務(wù)不執(zhí)行,空方法 。

DiscardOldestPolicy   從隊(duì) 列里面拋棄head的一個任務(wù),并再次execute 此task。

CallerRunsPolicy        在調(diào)用execute的線程里面執(zhí)行此command,會阻塞入口 。 

用戶自定義拒絕策略   實(shí)現(xiàn)RejectedExecutionHandler,并自己定義策略模式。

再次需要注意的是,ThreadPoolExecutor.submit() 函數(shù),此方法內(nèi)部調(diào)用的execute方法,并把execute執(zhí)行完后的結(jié)果給返回,但如果任務(wù)并沒有執(zhí)行的話(被拒絕了),則submit返回的future.get()會一直等到。

future 內(nèi)部其實(shí)還是一個runnable,并把command給封裝了下,當(dāng)command執(zhí)行完后,future會返回一個值。

newCachedThreadPool:

底層:返回ThreadPoolExecutor實(shí)例,corePoolSize為0;maximumPoolSize為Integer.MAX_VALUE;keepAliveTime為60L;unit為TimeUnit.SECONDS;workQueue為SynchronousQueue(同步隊(duì)列)

通俗:當(dāng)有新任務(wù)到來,則插入到SynchronousQueue中,由于SynchronousQueue是同步隊(duì)列,因此會在池中尋找可用線程來執(zhí)行,若有可以線程則執(zhí)行,若沒有可用線程則創(chuàng)建一個線程來執(zhí)行該任務(wù);若池中線程空閑時間超過指定大小,則該線程會被銷毀。

適用:執(zhí)行很多短期異步的小程序或者負(fù)載較輕的服務(wù)器

newFixedThreadPool:

底層:返回ThreadPoolExecutor實(shí)例,接收參數(shù)為所設(shè)定線程數(shù)量nThread,corePoolSize為nThread,maximumPoolSize為nThread;keepAliveTime為0L(不限時);unit為:TimeUnit.MILLISECONDS;WorkQueue為:new LinkedBlockingQueue<Runnable>() 無解阻塞隊(duì)列

通俗:創(chuàng)建可容納固定數(shù)量線程的池子,每隔線程的存活時間是無限的,當(dāng)池子滿了就不在添加線程了;如果池中的所有線程均在繁忙狀態(tài),對于新任務(wù)會進(jìn)入阻塞隊(duì)列中(無界的阻塞隊(duì)列)

適用:執(zhí)行長期的任務(wù),性能好很多

newSingleThreadExecutor:

底層:FinalizableDelegatedExecutorService包裝的ThreadPoolExecutor實(shí)例,corePoolSize為1;maximumPoolSize為1;keepAliveTime為0L;unit為:TimeUnit.MILLISECONDS;workQueue為:new LinkedBlockingQueue<Runnable>() 無解阻塞隊(duì)列

通俗:創(chuàng)建只有一個線程的線程池,且線程的存活時間是無限的;當(dāng)該線程正繁忙時,對于新任務(wù)會進(jìn)入阻塞隊(duì)列中(無界的阻塞隊(duì)列)

適用:一個任務(wù)一個任務(wù)執(zhí)行的場景

NewScheduledThreadPool:

底層:創(chuàng)建ScheduledThreadPoolExecutor實(shí)例,corePoolSize為傳遞來的參數(shù),maximumPoolSize為Integer.MAX_VALUE;keepAliveTime為0;unit為:TimeUnit.NANOSECONDS;workQueue為:new DelayedWorkQueue() 一個按超時時間升序排序的隊(duì)列

通俗:創(chuàng)建一個固定大小的線程池,線程池內(nèi)線程存活時間無限制,線程池可以支持定時及周期性任務(wù)執(zhí)行,如果所有線程均處于繁忙狀態(tài),對于新任務(wù)會進(jìn)入DelayedWorkQueue隊(duì)列中,這是一種按照超時時間排序的隊(duì)列結(jié)構(gòu)

適用:周期性執(zhí)行任務(wù)的場景

線程池任務(wù)執(zhí)行流程:

當(dāng)線程池小于corePoolSize時,新提交任務(wù)將創(chuàng)建一個新線程執(zhí)行任務(wù),即使此時線程池中存在空閑線程。

當(dāng)線程池達(dá)到corePoolSize時,新提交任務(wù)將被放入workQueue中,等待線程池中任務(wù)調(diào)度執(zhí)行

當(dāng)workQueue已滿,且maximumPoolSize>corePoolSize時,新提交任務(wù)會創(chuàng)建新線程執(zhí)行任務(wù)

當(dāng)提交任務(wù)數(shù)超過maximumPoolSize時,新提交任務(wù)由RejectedExecutionHandler處理

當(dāng)線程池中超過corePoolSize線程,空閑時間達(dá)到keepAliveTime時,關(guān)閉空閑線程

當(dāng)設(shè)置allowCoreThreadTimeOut(true)時,線程池中corePoolSize線程空閑時間達(dá)到keepAliveTime也將關(guān)閉

關(guān)于線程池的種類,區(qū)別和使用場景是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

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

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

AI