學習Java基礎知識,打通面試關~十三鎖機制

技術小能手發表於2018-07-09

靜態建立執行緒池

我們平常使用的大部分還是依靠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”。


相關文章