91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

深入理解Java多線程與并發框(第?篇)——線程池參數

發布時間:2020-08-04 20:16:40 來源:ITPUB博客 閱讀:145 作者:無敵天驕 欄目:軟件技術

深入理解Java多線程與并發框(第?篇)——線程池參數

ThreadPoolExecutor線程池

線程的創建和銷毀都會消耗大量資源,就好像公司每天上午9點工作時就招進一批員工,晚上6點干完活就辭退一批員工,這都會銷毀公司大量資源。所以合理利用 “池” 中固定、穩定的線程是非常有必要的。

擴展關系

ThreadPoolExecutor 構造方法

ThreadPoolExecutor 共有四個構造方法:

ThreadPoolExecutor(int, int, long, TimeUnit, BlockingQueue<Runnable>)
ThreadPoolExecutor(int, int, long, TimeUnit, BlockingQueue<Runnable>, ThreadFactory)
ThreadPoolExecutor(int, int, long, TimeUnit, BlockingQueue<Runnable>, RejectedExecutionHandler)
ThreadPoolExecutor(int, int, long, TimeUnit, BlockingQueue<Runnable>, ThreadFactory, RejectedExecutionHandler)

以最多參數的構造方法為例進行分析:

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler) {
    // 核心線程池不能小于0
    if (corePoolSize < 0 ||
            // 最大池大小不能小于等于0
    maximumPoolSize <= 0 ||
            // 最大池大小不能小于核心池大小
    maximumPoolSize < corePoolSize ||
            // 存活時間不能小于0
    keepAliveTime < 0)
            // 否則將會拋出 IllegalArgumentException 非法參數異常
    throw new IllegalArgumentException();
    // 工作隊列、線程工廠、拒絕執行的處理策略都不能為空,否則將會排除NPE空指針異常
    if (workQueue == null || threadFactory == null || handler == null)
            throw new NullPointerException();
    this.acc = System.getSecurityManager() == null ?
                null :
                AccessController.getContext();
    this.corePoolSize = corePoolSize;
    this.maximumPoolSize = maximumPoolSize;
    this.workQueue = workQueue;
    this.keepAliveTime = unit.toNanos(keepAliveTime);
    this.threadFactory = threadFactory;
    this.handler = handler;
}

1. 參數 corePoolSize 核心線程池大小:

線程池中一直會存活該大小的線程數,即使是沒有工作(任務)需要執行。除非設置 allowCoreThreadTimeOut 為 true ,線程池中的核心線程會超時關閉。

2. 參數 maximumPoolSize 線程池最大大小:

線程池最大允許同時存活的線程的大小。

3. 參數 keepAliveTime 線程空閑時間:

當線程池中的線程空閑時間達到 keepAliveTime 時,線程會被銷毀,僅保留 corePoolSize 大小線程,如果allowCoreThreadTimeOut 為 true ,則線程池中包含核心線程在內空閑線程都會被銷毀。

4. 參數 unit 時間單位:

keepAliveTime 的時間單位(枚舉類型)TimeUnit ,其可選單位有 TimeUnit.DAYS 天、TimeUnit.HOURS 小時、TimeUnit.MINUTES 分鐘、TimeUnit.SECONDS秒、TimeUnitMILLISECONDS.毫秒、TimeUnit.MICROSECONDS微秒、TimeUnit.NANOSECONDS納秒,常用的是秒。

5. 參數 workQueue 任務隊列(工作隊列、緩存隊列):

當任務所需的線程數達到核心線程數 corePoolSize 時,新任務會放在工作隊列中排隊(緩存)等待執行。如果任務所需的線程數達到核心線程數 corePoolSize 時,并且工作隊列已滿時,并且線程池最大大小 maximumPoolSize 大于 核心線程池大小 corePoolSize 時,才會創建新的線程去處理任務。

經常有個錯覺,認為當任務所需的線程數達到線程池最大線程數 maximumPoolSize 時,新任務才會進入工作隊列,這是不對的。

6. 參數 threadFactory 線程工廠:

用于創建線程池中線程的工廠。創建線程時,經常會給這一批具有處理相同類型任務的線程命名和線程工廠命名(*線程工廠命名是指給poolName線程池命名,作為線程名稱的前綴prefix),以此來標識線程的用處,在分析程序執行信息或排查程序異常問題時,非常有幫助。

7. 參數 handler 拒絕處理策略:

線程池拒絕處理任務有一下兩者情況:

①. 當線程池中的線程數達到核心池大小時,并且任務隊列已滿,會使用拒絕處理策略;(此種情況就像工作臺上的工作量積累已滿,又沒有足夠的人員去處理,那么我們就可以拒絕處理新任務。)
②. 當調用shutdown() 方法后,會等待線程池中正在執行的任務執行完畢,然后再關閉線程池,如果在調用 shutdown() 方法后(還未真正關閉時),緊接著又有新的任務提交時,會使用拒絕處理策略。(此種情況就像工作到了下班時間,工作人員還在忙著手頭上剩余的工作,如果此時又新任務提交,那么我們就可以拒絕處理新任務。)

(當然也可以不拒絕)

拒絕處理策略

深入理解Java多線程與并發框(第?篇)——線程池參數

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

廊坊市| 浑源县| 丰城市| 和硕县| 东阿县| 石门县| 昂仁县| 松溪县| 平乡县| 平山县| 永平县| 赣州市| 高唐县| 西青区| 米泉市| 福建省| 綦江县| 玛曲县| 二手房| 阜阳市| 惠水县| 钟山县| 云霄县| 渭源县| 泰和县| 安乡县| 连云港市| 灵川县| 陇川县| 黎平县| 秭归县| 江永县| 曲沃县| 浪卡子县| 平利县| 鹤峰县| 平山县| 彭州市| 历史| 汉寿县| 富源县|