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

溫馨提示×

溫馨提示×

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

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

ThreadPoolExecutor線程池的示例分析

發布時間:2021-11-17 12:00:42 來源:億速云 閱讀:161 作者:小新 欄目:大數據

小編給大家分享一下ThreadPoolExecutor線程池的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

線程池參數

ThreadPoolExecutor內部有四個構造方法,下面只列出參數最多的一個(另外三個都是補充默認參數后調用的這個):

/**
 * Creates a new {@code ThreadPoolExecutor} with the given initial
 * parameters.
 *
 * @param corePoolSize the number of threads to keep in the pool, even
 *        if they are idle, unless {@code allowCoreThreadTimeOut} is set
 * @param maximumPoolSize the maximum number of threads to allow in the
 *        pool
 * @param keepAliveTime when the number of threads is greater than
 *        the core, this is the maximum time that excess idle threads
 *        will wait for new tasks before terminating.
 * @param unit the time unit for the {@code keepAliveTime} argument
 * @param workQueue the queue to use for holding tasks before they are
 *        executed.  This queue will hold only the {@code Runnable}
 *        tasks submitted by the {@code execute} method.
 * @param threadFactory the factory to use when the executor
 *        creates a new thread
 * @param handler the handler to use when execution is blocked
 *        because the thread bounds and queue capacities are reached
 * @throws IllegalArgumentException if one of the following holds:<br>
 *         {@code corePoolSize < 0}<br>
 *         {@code keepAliveTime < 0}<br>
 *         {@code maximumPoolSize <= 0}<br>
 *         {@code maximumPoolSize < corePoolSize}
 * @throws NullPointerException if {@code workQueue}
 *         or {@code threadFactory} or {@code handler} is null
 */
public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler) {
    if (corePoolSize < 0 ||
        maximumPoolSize <= 0 ||
        maximumPoolSize < corePoolSize ||
        keepAliveTime < 0)
        throw new IllegalArgumentException();
    if (workQueue == null || threadFactory == null || handler == null)
        throw new NullPointerException();
    this.corePoolSize = corePoolSize;
    this.maximumPoolSize = maximumPoolSize;
    this.workQueue = workQueue;
    this.keepAliveTime = unit.toNanos(keepAliveTime);
    this.threadFactory = threadFactory;
    this.handler = handler;
}

其實從構造方法的注釋中,我們就能知道每個參數的意思:

  • corePoolSize:保留在線程池中的線程數量,即使它們是閑置的,除非allowCoreThreadTimeOut被設置。

  • maximumPoolSize:線程池允許的最大線程數。

  • keepAliveTime:當線程數大于corePoolSize時,那些額外的空閑線程在停止前等待新任務的最大時間。

  • unit:keepAliveTime參數的時間單位。

  • workQueue:在任務執行之前,用于保存任務的隊列,隊列只會保存那些使用execute方法提交的可執行的任務。

  • threadFactory:當線程池創建一個新線程時所用到的工廠。

  • handler:當任務的執行因為線程數量和隊列容量到達邊界而被阻止時,所調用的handler。

線程池工作原理

當一個新任務被提交時:

  1. 當前活躍線程數<corePoolSize,則創建一個新線程執行新任務;

  2. 當前活躍線程數>corePoolSize,且隊列(workQueue)未滿時,則將新任務放入隊列中;

  3. 當前活躍線程數>corePoolSize,且隊列(workQueue)已滿,且當前活躍線程數<maximumPoolSize,則繼續創建一個新線程執行新任務;

  4. 當前活躍線程數>corePoolSize,且隊列(workQueue)已滿,且當前活躍線程數=maximumPoolSize,則執行拒絕策略(handler);

當任務執行完成后:

  1. 超出corePoolSize的空閑線程,在等待新任務時,如果超出了keepAliveTime,則線程會被銷毀;

  2. 如果allowCoreThreadTimeOut被設置為true,那么corePoolSize以內的空閑線程,如果超出了keepAliveTime,則同樣會被銷毀。

線程池隊列

通過構造方法可以知道,workQueue參數是BlockingQueue<Runnable>類型的,而BlockingQueue是JUC包里的一個接口,其實現有:

ThreadPoolExecutor線程池的示例分析

其中,常用的隊列如下:

  1. ArrayBlockingQueue:規定大小的BlockingQueue,其構造必須指定大小。其所含的對象是FIFO順序排序的。

  2. LinkedBlockingQueue:大小不固定的BlockingQueue,若其構造時指定大小,生成的BlockingQueue有大小限制,不指定大小,其大小有Integer.MAX_VALUE來決定。其所含的對象是FIFO順序排序的。

  3. PriorityBlockingQueue:類似于LinkedBlockingQueue,但是其所含對象的排序不是FIFO,而是依據對象的自然順序或者構造函數的Comparator決定。

  4. SynchronizedQueue:特殊的BlockingQueue,對其的操作必須是放和取交替完成。

線程池拒絕策略

同樣,通過構造方法可以知道,handler參數是RejectedExecutionHandler類型的,而RejectedExecutionHandler同樣是JUC包里的一個接口,其實現有:

ThreadPoolExecutor線程池的示例分析

  1. DiscardOldestPolicy:丟掉緩存在隊列中的最早的任務,然后重新嘗試運行新任務。

  2. AbortPolicy:直接拒絕添加新任務,并拋出異常。

  3. CallerRunsPolicy:使用當前線程執行該任務,而不是使用線程池中的線程。

  4. DiscardPolicy:刪除提交的新任務 。

以上是“ThreadPoolExecutor線程池的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

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

AI

孟津县| 巴青县| 云龙县| 射阳县| 丽水市| 盖州市| 大埔县| 香河县| 乐山市| 和龙市| 天峻县| 通榆县| 乡城县| 邮箱| 阿荣旗| 云浮市| 阿克苏市| 衡东县| 凤冈县| 札达县| 鄂伦春自治旗| 鱼台县| 应用必备| 平舆县| 定陶县| 湘阴县| 塔河县| 容城县| 子洲县| 澄迈县| 万载县| 辽中县| 岑巩县| 富锦市| 申扎县| 宜兴市| 阿勒泰市| 汉阴县| 化德县| 定南县| 尉犁县|