java中常見的四種執行緒池的區別
在使用執行緒時,可以這樣建立一個執行緒池:
ExecutorService executorService= Executors.newCachedThreadPool();
executorService.execute(()-> System.out.println("run ..."));
檢視下java.util.concurrent.Executors原始碼,可以發現有四種建立執行緒池的方法,分別為:newCacbedThreadPool、newFixedThreadPool、newScheduledThreadPool、newSingleThreadExecutor,其實這四種建立執行緒池的方法都是有ThreadPoolExecutor來實現的。原始碼結構圖如下:
下面來分別看一下這四種執行緒池:
一、newCacheThreadPool
為每一個任務建立一個執行緒,並且也可以重用已有的執行緒,無核心執行緒數量,超過60s的空閒執行緒將棄用,但是會受到系統實際記憶體的執行緒。原始碼如下:
/**無參構造方法*/
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
/**有參的構造方法,可以傳入threadFactory*/
public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>(),
threadFactory);
}
二、newFixedThreadPool
核心執行緒數和最大執行緒數是相同的,並且無空閒執行緒,核心執行緒數無限時要求,就是可以建立固定大小的執行緒數量,同時阻塞佇列是沒有大小限制的,原始碼如下:
/**建立固定大小的執行緒數*/
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
/**建立固定大小的執行緒數,並可以指定threadFactory*/
public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(),
threadFactory);
}
三、newScheduledThreadPool
具有延遲和週期執行執行緒的執行緒池,固定的核心執行緒數,最大執行緒數沒有限制,空閒的執行緒會立即啟用原始碼如下:
/**建立固定大小的corePool*/
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
return new ScheduledThreadPoolExecutor(corePoolSize);
}
/**檢視ScheduledThreadPoolExecutor類,發現是整合的ThreadPoolExecutor*/
public ScheduledThreadPoolExecutor(int corePoolSize) {
super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
new DelayedWorkQueue());
}
/**建立固定大小的corePool,並指定threadFactory*/
public static ScheduledExecutorService newScheduledThreadPool(
int corePoolSize, ThreadFactory threadFactory) {
return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory);
}
/**檢視ScheduledThreadPoolExecutor類,發現是整合的ThreadPoolExecutor*/
public ScheduledThreadPoolExecutor(int corePoolSize,
ThreadFactory threadFactory) {
super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
new DelayedWorkQueue(), threadFactory);
}
四、newSingleThreadExecutor
建立只有一個的核心執行緒,只處理一個執行緒,其實並不能處理併發,原始碼如下:
/**無參*/
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
/**指定threadFactory*/
public static ScheduledExecutorService newSingleThreadScheduledExecutor(ThreadFactory threadFactory) {
return new DelegatedScheduledExecutorService
(new ScheduledThreadPoolExecutor(1, threadFactory));
}
以上四種建立執行緒池的方式,通過原始碼可以發現都是基於ThreadPoolExecutor類中的構造方法進行實現的。
相關文章
- java中常見的六種執行緒池詳解Java執行緒
- 常見的四種執行緒池執行緒
- 執行緒池以及四種常見執行緒池執行緒
- java 四種執行緒池的使用Java執行緒
- Java四種執行緒池的使用Java執行緒
- java自帶的四種執行緒池Java執行緒
- Java 四種執行緒池的用法分析Java執行緒
- Java程式猿必會的四種執行緒池Java執行緒
- JDK提供的四種執行緒池JDK執行緒
- Java 執行緒池四種拒絕策略Java執行緒
- Java通過Executors提供四種執行緒池Java執行緒
- Java提供的幾種執行緒池Java執行緒
- java--執行緒池--建立執行緒池的幾種方式與執行緒池操作詳解Java執行緒
- Java併發程式設計:Java的四種執行緒池的使用,以及自定義執行緒工廠Java程式設計執行緒
- 知道執行緒池的四種拒絕策略嗎?執行緒
- 執行緒池的五種狀態及建立執行緒池的幾種方式執行緒
- Java多執行緒-執行緒池的使用Java執行緒
- 簡單的執行緒池(四)執行緒
- Java建立多執行緒的四種方式Java執行緒
- Java執行緒池二:執行緒池原理Java執行緒
- JAVA執行緒池的使用Java執行緒
- 執行緒池見解執行緒
- Java執行緒池newCachedThreadPool()與newFixedThreadPool()區別 | BaeldungJava執行緒thread
- Java 中執行緒池的7種建立方式!Java執行緒
- Java多執行緒——執行緒池Java執行緒
- Java執行緒池Java執行緒
- java 執行緒池Java執行緒
- Android執行緒篇(四)深入理解Java執行緒池(二)Android執行緒Java
- 執行緒池建立的幾種方式執行緒
- Java執行緒池的那些事Java執行緒
- JDK內建執行緒池的共同點和區別JDK執行緒
- java執行緒池趣味事:這不是執行緒池Java執行緒
- java多執行緒9:執行緒池Java執行緒
- Java多執行緒18:執行緒池Java執行緒
- SpringBoot執行緒池和Java執行緒池的實現原理Spring Boot執行緒Java
- 詳解執行緒池的作用及Java中如何使用執行緒池執行緒Java
- 執行緒建立的四種方式執行緒
- 淺談執行緒池(上):執行緒池的作用及CLR執行緒池執行緒