學習Java基礎知識,打通面試關~十三鎖機制
靜態建立執行緒池
我們平常使用的大部分還是依靠java中自帶的靜態工廠產生的執行緒池。先了解下自帶的執行緒池。
newFixedThreadPool(int numThreads)
該執行緒池會在初始化的指定執行緒數量。具有以下的特點
1.在任何時刻都是最多有numThreads的執行緒數量活動。如果超過限制會在LinkedBlockingQueue中等待。
2.當達到核心執行緒數的時候,執行緒數不在繼續增加。
3.有工作執行緒退出,新的工作執行緒被建立來達到設定的執行緒數。
Executors.newFixedThreadPool(1);
//原始碼實現
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
newCachedThreadPool
該執行緒池是一個可以用來快取的執行緒池。
1.嘗試快取使用過的執行緒。
2.沒有快取的執行緒池時,就會使用工廠方法建立執行緒池,最大的容量理論上是Integer.MAX_VALUE。這個跟伺服器的配置有關。所以如果過來大量的執行緒任務,那麼該執行緒池會在瞬間建立多個執行緒來執行工作。
3.時間上多餘的執行緒超過60秒會被終止移除快取中。
4.內部使用的SynchronousQueue實現的佇列,該佇列在實現的時候沒有容量。適合來做交換的工作。
Executors.newCachedThreadPool();
//原始碼實現
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
newSingleThreadExecutor
該執行緒池是用來設定單個的執行緒池,使用的佇列是無界佇列。
因為提交的任務只要一個是能活動的,剩下的是放到無界佇列中。
佇列是先進先出的。那麼執行順序是有序的。
Executors.newSingleThreadExecutor();
//原始碼
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
newWorkStealingPool
工作執行緒,該執行緒是在jdk1.8以後新增加的.使用的是ForkJoinPool建立執行緒池。該任務執行沒有順序。需要考慮到硬體的cpu核心數。
Executors.newWorkStealingPool();
public static ExecutorService newWorkStealingPool() {
return new ForkJoinPool
(Runtime.getRuntime().availableProcessors(), //預設使用的是硬體的cpu數目
ForkJoinPool.defaultForkJoinWorkerThreadFactory,
null, true);
}
Executors.newWorkStealingPool(10);
public static ExecutorService newWorkStealingPool(int parallelism) {
return new ForkJoinPool
(parallelism, // 使用的是自定義的核心數
ForkJoinPool.defaultForkJoinWorkerThreadFactory,
null, true);
}
newSingleThreadScheduledExecutor()與newScheduledThreadPool(int poolSize)
週期性的排程執行任務的執行緒池。 單個執行。
Executors.newSingleThreadScheduledExecutor();
public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
return new DelegatedScheduledExecutorService
(new ScheduledThreadPoolExecutor(1));
}
//核心週期執行的執行緒數
Executors.newScheduledThreadPool(10);
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
return new ScheduledThreadPoolExecutor(corePoolSize);
}
瞭解其java內部的靜態執行緒池,並且在程式中使用其策略。當然在這種我們沒有看到的是執行緒池的拒絕策略。無界佇列和有界佇列,核心數的與最大的核心數的設定,這些不同。那麼我們的執行拒絕策略也是不同的。在接下里的文章我們會具體瞭解拒絕策略。
原文釋出時間為:2018-07-09
本文作者:mengrui
本文來自雲棲社群合作伙伴“LuckQI”,瞭解相關資訊可以關注“LuckQI”。
相關文章
- 學習Java基礎知識,打通面試關~十二介面與抽象類Java面試抽象
- 鎖相關基礎知識
- Java基礎知識面試題Java面試題
- Java 基礎面試知識點Java面試
- Java EE 基礎知識學習(六)Java
- 《面試補習》- Java鎖知識大梳理面試Java
- 別樣JAVA學習(一)基礎知識Java
- JavaSE基礎知識學習-----Static關鍵字Java
- 【ASM學習】基礎知識ASM
- java基礎學習之十三:泛型Java泛型
- Java基礎知識學習筆記總結Java筆記
- Java基礎面試知識點總結Java面試
- Oracle鎖基礎知識Oracle
- Redis基礎知識(學習筆記2--分散式鎖)Redis筆記分散式
- Android基礎知識學習Android
- 基礎知識學習筆記筆記
- JavaSE基礎知識學習-----集合Java
- WebAPI基礎知識學習(1)WebAPI
- 【ASM學習】ASM基礎知識ASM
- Android面試之——數學基礎知識Android面試
- Redis基礎知識(學習筆記22--分散式鎖 Redisson )Redis筆記分散式
- Java基礎複習,整理知識點Java
- Java基礎知識Java
- 計算機基礎知識複習計算機
- 學習Java知識應該注意哪些基礎原則Java
- 初識Java Java基礎知識Java
- JavaSE基礎知識學習—–多型Java多型
- JavaSE基礎學習知識整理大全Java
- RxJava 學習筆記 -- 基礎知識RxJava筆記
- JVM學習之JVM基礎知識JVM
- 怎麼學習基礎知識啊?
- JavaSE基礎知識學習-----多型Java多型
- JavaSE基礎知識學習-----Object類JavaObject
- JavaSE基礎知識學習-----繼承Java繼承
- go語言學習-基礎知識Go
- 圖解機器學* | 機器學*基礎知識圖解
- 零基礎學習Java,全方位知識點總結!Java
- 【Java面試】Java基礎知識面試題—2020最新版!Java面試題