您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(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é)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責(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)容。