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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

线程池参数详解

發(fā)布時間:2023/12/20 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线程池参数详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)載來自:http://blog.csdn.net/zhouhl_cn/article/details/7392607 和http://www.cnblogs.com/dolphin0520/p/3932921.html


JDK1.5中引入了強大的concurrent包,其中最常用的莫過了線程池的實現(xiàn)ThreadPoolExecutor,它給我們帶來了極大的方便,但同時,對于該線程池不恰當?shù)脑O置也可能使其效率并不能達到預期的效果,甚至僅相當于或低于單線程的效率。

ThreadPoolExecutor類可設置的參數(shù)主要有:

  • corePoolSize

在創(chuàng)建了線程池后,默認情況下,線程池中并沒有任何線程,而是等待有任務到來才創(chuàng)建線程去執(zhí)行任務,(除非調(diào)用了prestartAllCoreThreads()或者prestartCoreThread()方法,從這2個方法的名字就可以看出,是預創(chuàng)建線程的意思,即在沒有任務到來之前就創(chuàng)建corePoolSize個線程或者一個線程)。

默認情況下,在創(chuàng)建了線程池后,線程池中的線程數(shù)為0,當有任務來之后,就會創(chuàng)建一個線程去執(zhí)行任務,當線程池中的線程數(shù)目達到corePoolSize后,就會把到達的任務放到緩存隊列當中。核心線程在allowCoreThreadTimeout被設置為true時會超時退出,默認情況下不會退出。

  • maxPoolSize
當線程數(shù)大于或等于核心線程,且任務隊列已滿時,線程池會創(chuàng)建新的線程,直到線程數(shù)量達到maxPoolSize。如果線程數(shù)已等于maxPoolSize,且任務隊列已滿,則已超出線程池的處理能力,線程池會拒絕處理任務而拋出異常。
  • keepAliveTime

當線程空閑時間達到keepAliveTime,該線程會退出,直到線程數(shù)量等于corePoolSize。如果allowCoreThreadTimeout設置為true,則所有線程均會退出直到線程數(shù)量為0。

  • allowCoreThreadTimeout

是否允許核心線程空閑退出,默認值為false。

  • queueCapacity

任務隊列容量。從maxPoolSize的描述上可以看出,任務隊列的容量會影響到線程的變化,因此任務隊列的長度也需要恰當?shù)脑O置。


還有就是 workQueue:一個阻塞隊列,用來存儲等待執(zhí)行的任務,這個參數(shù)的選擇也很重要,會對線程池的運行過程產(chǎn)生重大影響,一般來說,這里的阻塞隊列有以下幾種選擇:

ArrayBlockingQueue; LinkedBlockingQueue; SynchronousQueue; PriorityBlockingQueue? ArrayBlockingQueue和PriorityBlockingQueue使用較少,一般使用LinkedBlockingQueue和Synchronous。線程池的排隊策略與BlockingQueue有關。
  • threadFactory:線程工廠,主要用來創(chuàng)建線程;
  • handler:表示當拒絕處理任務時的策略,有以下四種取值:
ThreadPoolExecutor.AbortPolicy:丟棄任務并拋出RejectedExecutionException異常。 ThreadPoolExecutor.DiscardPolicy:也是丟棄任務,但是不拋出異常。 ThreadPoolExecutor.DiscardOldestPolicy:丟棄隊列最前面的任務,然后重新嘗試執(zhí)行任務(重復此過程) ThreadPoolExecutor.CallerRunsPolicy:由調(diào)用線程處理該任務

線程池按以下行為執(zhí)行任務

  • 當線程數(shù)小于核心線程數(shù)時,創(chuàng)建線程。
  • 當線程數(shù)大于等于核心線程數(shù),且任務隊列未滿時,將任務放入任務隊列。
  • 當線程數(shù)大于等于核心線程數(shù),且任務隊列已滿
  • 若線程數(shù)小于最大線程數(shù),創(chuàng)建線程
  • 若線程數(shù)等于最大線程數(shù),拋出異常,拒絕任務

  • 系統(tǒng)負載

    參數(shù)的設置跟系統(tǒng)的負載有直接的關系,下面為系統(tǒng)負載的相關參數(shù):

    • tasks,每秒需要處理的最大任務數(shù)量
    • tasktime,處理第個任務所需要的時間
    • responsetime,系統(tǒng)允許任務最大的響應時間,比如每個任務的響應時間不得超過2秒。


    參數(shù)設置


    corePoolSize:

    每個任務需要tasktime秒處理,則每個線程每鈔可處理1/tasktime個任務。系統(tǒng)每秒有tasks個任務需要處理,則需要的線程數(shù)為:tasks/(1/tasktime),即tasks*tasktime個線程數(shù)。假設系統(tǒng)每秒任務數(shù)為100~1000,每個任務耗時0.1秒,則需要100*0.1至1000*0.1,即10~100個線程。那么corePoolSize應該設置為大于10,具體數(shù)字最好根據(jù)8020原則,即80%情況下系統(tǒng)每秒任務數(shù),若系統(tǒng)80%的情況下第秒任務數(shù)小于200,最多時為1000,則corePoolSize可設置為20。


    queueCapacity:

    任務隊列的長度要根據(jù)核心線程數(shù),以及系統(tǒng)對任務響應時間的要求有關。隊列長度可以設置為(corePoolSize/tasktime)*responsetime: (20/0.1)*2=400,即隊列長度可設置為400。

    隊列長度設置過大,會導致任務響應時間過長,切忌以下寫法:

    LinkedBlockingQueue queue = new LinkedBlockingQueue();

    這實際上是將隊列長度設置為Integer.MAX_VALUE,將會導致線程數(shù)量永遠為corePoolSize,再也不會增加,當任務數(shù)量陡增時,任務響應時間也將隨之陡增。


    maxPoolSize:

    當系統(tǒng)負載達到最大值時,核心線程數(shù)已無法按時處理完所有任務,這時就需要增加線程。每秒200個任務需要20個線程,那么當每秒達到1000個任務時,則需要(1000-queueCapacity)*(20/200),即60個線程,可將maxPoolSize設置為60。


    keepAliveTime:

    線程數(shù)量只增加不減少也不行。當負載降低時,可減少線程數(shù)量,如果一個線程空閑時間達到keepAliveTiime,該線程就退出。默認情況下線程池最少會保持corePoolSize個線程。


    allowCoreThreadTimeout:

    默認情況下核心線程不會退出,可通過將該參數(shù)設置為true,讓核心線程也退出。


    以上關于線程數(shù)量的計算并沒有考慮CPU的情況。若結合CPU的情況,比如,當線程數(shù)量達到50時,CPU達到100%,則將maxPoolSize設置為60也不合適,此時若系統(tǒng)負載長時間維持在每秒1000個任務,則超出線程池處理能力,應設法降低每個任務的處理時間(tasktime)。


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

    總結

    以上是生活随笔為你收集整理的线程池参数详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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