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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

newCachedThreadPool

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

newFixedThreadPool

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

newSingleThreadExecutor:

  • 底層:FinalizableDelegatedExecutorService包裝的ThreadPoolExecutor實例,corePoolSize1maximumPoolSize1keepAliveTime0Lunit為:TimeUnit.MILLISECONDSworkQueue為:new LinkedBlockingQueue<Runnable>() 無解阻塞隊列
  • 通俗:創建只有一個線程的線程池,且線程的存活時間是無限的;當該線程正繁忙時,對于新任務會進入阻塞隊列中(無界的阻塞隊列)
  • 適用:一個任務一個任務執行的場景

NewScheduledThreadPool:

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

線程池任務執行流程:

  • 當線程池小于corePoolSize時,新提交任務將創建一個新線程執行任務,即使此時線程池中存在空閑線程。
  • 當線程池達到corePoolSize時,新提交任務將被放入workQueue中,等待線程池中任務調度執行
  • workQueue已滿,且maximumPoolSize>corePoolSize時,新提交任務會創建新線程執行任務
  • 當提交任務數超過maximumPoolSize時,新提交任務由RejectedExecutionHandler處理
  • 當線程池中超過corePoolSize線程,空閑時間達到keepAliveTime時,關閉空閑線程
  • 當設置allowCoreThreadTimeOut(true)時,線程池中corePoolSize線程空閑時間達到keepAliveTime也將關閉
  • 備注:

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

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

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

    轉載于:https://www.cnblogs.com/sachen/p/7401959.html

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。