日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

线程池的种类,区别和使用场景

發(fā)布時(shí)間:2023/12/13 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线程池的种类,区别和使用场景 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

newCachedThreadPool

  • 底層:返回ThreadPoolExecutor實(shí)例,corePoolSize0maximumPoolSizeInteger.MAX_VALUEkeepAliveTime60LunitTimeUnit.SECONDSworkQueueSynchronousQueue(同步隊(duì)列)
  • 通俗:當(dāng)有新任務(wù)到來,則插入到SynchronousQueue中,由于SynchronousQueue是同步隊(duì)列,因此會(huì)在池中尋找可用線程來執(zhí)行,若有可以線程則執(zhí)行,若沒有可用線程則創(chuàng)建一個(gè)線程來執(zhí)行該任務(wù);若池中線程空閑時(shí)間超過指定大小,則該線程會(huì)被銷毀。
  • 適用:執(zhí)行很多短期異步的小程序或者負(fù)載較輕的服務(wù)器

newFixedThreadPool

  • 底層:返回ThreadPoolExecutor實(shí)例,接收參數(shù)為所設(shè)定線程數(shù)量nThreadcorePoolSizenThreadmaximumPoolSizenThreadkeepAliveTime0L(不限時(shí))unit為:TimeUnit.MILLISECONDSWorkQueue為:new LinkedBlockingQueue<Runnable>() 無解阻塞隊(duì)列
  • 通俗:創(chuàng)建可容納固定數(shù)量線程的池子,每隔線程的存活時(shí)間是無限的,當(dāng)池子滿了就不在添加線程了;如果池中的所有線程均在繁忙狀態(tài),對(duì)于新任務(wù)會(huì)進(jìn)入阻塞隊(duì)列中(無界的阻塞隊(duì)列)
  • 適用:執(zhí)行長期的任務(wù),性能好很多

newSingleThreadExecutor:

  • 底層:FinalizableDelegatedExecutorService包裝的ThreadPoolExecutor實(shí)例,corePoolSize1maximumPoolSize1keepAliveTime0Lunit為:TimeUnit.MILLISECONDSworkQueue為:new LinkedBlockingQueue<Runnable>() 無解阻塞隊(duì)列
  • 通俗:創(chuàng)建只有一個(gè)線程的線程池,且線程的存活時(shí)間是無限的;當(dāng)該線程正繁忙時(shí),對(duì)于新任務(wù)會(huì)進(jìn)入阻塞隊(duì)列中(無界的阻塞隊(duì)列)
  • 適用:一個(gè)任務(wù)一個(gè)任務(wù)執(zhí)行的場(chǎng)景

NewScheduledThreadPool:

  • 底層:創(chuàng)建ScheduledThreadPoolExecutor實(shí)例,corePoolSize為傳遞來的參數(shù),maximumPoolSizeInteger.MAX_VALUEkeepAliveTime0unit為:TimeUnit.NANOSECONDSworkQueue為:new DelayedWorkQueue() 一個(gè)按超時(shí)時(shí)間升序排序的隊(duì)列
  • 通俗:創(chuàng)建一個(gè)固定大小的線程池,線程池內(nèi)線程存活時(shí)間無限制,線程池可以支持定時(shí)及周期性任務(wù)執(zhí)行,如果所有線程均處于繁忙狀態(tài),對(duì)于新任務(wù)會(huì)進(jìn)入DelayedWorkQueue隊(duì)列中,這是一種按照超時(shí)時(shí)間排序的隊(duì)列結(jié)構(gòu)
  • 適用:周期性執(zhí)行任務(wù)的場(chǎng)景

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

  • 當(dāng)線程池小于corePoolSize時(shí),新提交任務(wù)將創(chuàng)建一個(gè)新線程執(zhí)行任務(wù),即使此時(shí)線程池中存在空閑線程。
  • 當(dāng)線程池達(dá)到corePoolSize時(shí),新提交任務(wù)將被放入workQueue中,等待線程池中任務(wù)調(diào)度執(zhí)行
  • 當(dāng)workQueue已滿,且maximumPoolSize>corePoolSize時(shí),新提交任務(wù)會(huì)創(chuàng)建新線程執(zhí)行任務(wù)
  • 當(dāng)提交任務(wù)數(shù)超過maximumPoolSize時(shí),新提交任務(wù)由RejectedExecutionHandler處理
  • 當(dāng)線程池中超過corePoolSize線程,空閑時(shí)間達(dá)到keepAliveTime時(shí),關(guān)閉空閑線程
  • 當(dāng)設(shè)置allowCoreThreadTimeOut(true)時(shí),線程池中corePoolSize線程空閑時(shí)間達(dá)到keepAliveTime也將關(guān)閉
  • 備注:

    一般如果線程池任務(wù)隊(duì)列采用LinkedBlockingQueue隊(duì)列的話,那么不會(huì)拒絕任何任務(wù)(因?yàn)殛?duì)列大小沒有限制),這種情況下,ThreadPoolExecutor最多僅會(huì)按照最小線程數(shù)來創(chuàng)建線程,也就是說線程池大小被忽略了。

    如果線程池任務(wù)隊(duì)列采用ArrayBlockingQueue隊(duì)列的話,那么ThreadPoolExecutor將會(huì)采取一個(gè)非常負(fù)責(zé)的算法,比如假定線程池的最小線程數(shù)為4,最大為8所用的ArrayBlockingQueue最大為10。隨著任務(wù)到達(dá)并被放到隊(duì)列中,線程池中最多運(yùn)行4個(gè)線程(即最小線程數(shù))。即使隊(duì)列完全填滿,也就是說有10個(gè)處于等待狀態(tài)的任務(wù),ThreadPoolExecutor也只會(huì)利用4個(gè)線程。如果隊(duì)列已滿,而又有新任務(wù)進(jìn)來,此時(shí)才會(huì)啟動(dòng)一個(gè)新線程,這里不會(huì)因?yàn)殛?duì)列已滿而拒接該任務(wù),相反會(huì)啟動(dòng)一個(gè)新線程。新線程會(huì)運(yùn)行隊(duì)列中的第一個(gè)任務(wù),為新來的任務(wù)騰出空間。

    這個(gè)算法背后的理念是:該池大部分時(shí)間僅使用核心線程(4個(gè)),即使有適量的任務(wù)在隊(duì)列中等待運(yùn)行。這時(shí)線程池就可以用作節(jié)流閥。如果擠壓的請(qǐng)求變得非常多,這時(shí)該池就會(huì)嘗試運(yùn)行更多的線程來清理;這時(shí)第二個(gè)節(jié)流閥—最大線程數(shù)就起作用了。

    轉(zhuǎn)載于:https://www.cnblogs.com/sachen/p/7401959.html

    總結(jié)

    以上是生活随笔為你收集整理的线程池的种类,区别和使用场景的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。