線程池

線程池參數(shù)含義

 /**
     * ThreadPoolExecutor: 最全的構造方法又7個參數(shù):
     * int corePoolSize:                    表示的是核心線程數(shù)量,
     * int maximumPoolSize:                 線程池線程最大數(shù)量
     * keepAliveTime,unit                   非核心線程在空閑多久后回收
     * BlockingQueue<Runnable>  workQueue   緩存任務的阻塞隊列
     * ThreadFactory  threadFactory         指定創(chuàng)建線程的工廠
     * RejectedExecutionHandler handler     緩存隊列已滿,且線程池數(shù)量達到最大(maximumPoolSize),線程池拒絕添加新任務的策略
     *
     */
    public synchronized ExecutorService executorService() {
        if (executorService == null) {
            executorService = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60, TimeUnit.SECONDS,
                    new SynchronousQueue<Runnable>(), Util.threadFactory("OkHttp Dispatcher", false));
        }
        return executorService;
    }

記錄下線程池的策略:
1)如果沒有空閑的線程執(zhí)行該任務且當前運行的線程數(shù)少于corePoolSize,則添加新的線程執(zhí)行該任務
2)如果沒有空閑的線程執(zhí)行該任務且當前的線程數(shù)等于corePoolSize同時阻塞隊列未滿,則將任務入隊列,而不添加新的線程。
3)如果沒有空閑的線程執(zhí)行該任務且阻塞隊列已滿同時池中的線程數(shù)小于maximumPoolSize,則創(chuàng)建新的線程執(zhí)行任務。
4)如果沒有空閑的線程執(zhí)行該任務且阻塞隊列已滿同時池中的線程數(shù)等于maximumPoolSize,則根據(jù)構造函數(shù)中的handler指定的策略來拒絕新的任務。

合理配置線程池

要想合理地配置線程池,就必須首先分析任務特性
要想合理地配置線程池,就必須首先分析任務特性,可以從以下幾個角度來分析。
?任務的性質(zhì):CPU密集型任務、IO密集型任務和混合型任務。
?任務的優(yōu)先級:高、中和低。
?任務的執(zhí)行時間:長、中和短。
?任務的依賴性:是否依賴其他系統(tǒng)資源,如數(shù)據(jù)庫連接。
性質(zhì)不同的任務可以用不同規(guī)模的線程池分開處理。CPU密集型任務應配置盡可能小的線程,如配置Ncpu+1個線程的線程池。由于IO密集型任務線程并不是一直在執(zhí)行任務,則應配置盡可能多的線程,如2*Ncpu?;旌闲偷娜蝿?,如果可以拆分,將其拆分成一個CPU密集型任務和一個IO密集型任務,只要這兩個任務執(zhí)行的時間相差不是太大,那么分解后執(zhí)行的吞吐量將高于串行執(zhí)行的吞吐量。如果這兩個任務執(zhí)行時間相差太大,則沒必要進行分解??梢酝ㄟ^Runtime.getRuntime().availableProcessors()方法獲得當前設備的CPU個數(shù)。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容