Java線程池相關

線程池的規則與參數:java

1. corePoolSize:核心線程數線程

  • 核心線程會一直存活,及時沒有任務須要執行
  • 當線程數小於核心線程數時,即便有線程空閒,線程池也會優先建立新線程處理
  • 設置allowCoreThreadTimeout=true(默認false)時,核心線程會超時關閉

2. queueCapacity:任務隊列容量(阻塞隊列)code

  • 當核心線程數達到最大時,新任務會放在隊列中排隊等待執行

3. maxPoolSize:最大線程數隊列

  • 當線程數>=corePoolSize,且任務隊列已滿時。線程池會建立新線程來處理任務
  • 當線程數>=corePoolSize  且隊列未滿時,再也不建立新線程
  • 當線程數=maxPoolSize,且任務隊列已滿時,線程池會拒絕處理任務而拋出異常

4. keepAliveTime:非核心線程空閒時間ci

  • 當線程空閒時間達到keepAliveTime時,線程會退出,直到線程數量=corePoolSize

5. allowCoreThreadTimeout:容許核心線程超時it

  • 默認爲false;設置爲true時,核心線程也會在keepAliveTime後退出。

6. rejectedExecutionHandler:任務拒絕處理器io

  • 當線程數已經達到maxPoolSize,切隊列已滿,會拒絕新任務
  • shutdown()後的等待期內提交的任務,會被拒絕

幾類型線程池class

1. FixedThreadPool thread

public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {
    return new ThreadPoolExecutor(nThreads, nThreads,
                                  0L, TimeUnit.MILLISECONDS,
                                  new LinkedBlockingQueue<Runnable>(),
                                  threadFactory);
}

核心池等於最大池大小,隊列無界;核心線程不會退出。線程池

2. SingleThreadExecutor 

public static ExecutorService newSingleThreadExecutor() {  
        return new FinalizableDelegatedExecutorService  
            (new ThreadPoolExecutor(1, 1,  
                                    0L, TimeUnit.MILLISECONDS,  
                                    new LinkedBlockingQueue<Runnable>()));  
    }

核心池等於最大池=1,隊列無界;保證任務串行執行,當線程由於異常終止,會啓動新線程執行;該線程不會超時退出。

3. CachedThreadPool

public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                  60L, TimeUnit.SECONDS,
                                  new SynchronousQueue<Runnable>(),
                                  threadFactory);
}

核心池大小是0,最大池大小無上界,隊列無界;線程60s超時退出。適合短時間執行的大量任務。SynchronousQueue是一個容量只有1的阻塞隊列。

4. ScheduledThreadPool

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
    return new ScheduledThreadPoolExecutor(corePoolSize);
}
public ScheduledThreadPoolExecutor(int corePoolSize) {
    super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
          new DelayedWorkQueue());
}

使用DelayQueue實現定時執行。

相關文章
相關標籤/搜索