天天看點

java 線程池學習快速掃盲記

送出任務
執行任務 ←否 核心線程池是否已滿
↓是
将任務放入緩存隊列 ←否 等待隊列是否已滿
↓是
建立線程執行任務 ←否 線程池是否達到最大線程
↓是
執行拒絕政策處理無法處理的任務

使用線程池三種方式

ExecutorService threadPool = new Executors.newFixedThreadPool(5)
//一池固定數量線程
ExecutorService threadPool = new Executors.newSingleThreadPool();
//一池一線線程
ExecutorService threadPool = new Executors.newCachedThreadPool();
//一池n線程
 threadPool.execute(()->{
                   
                    System.out.println(Thread.currentThread().getName()+"處理任務");
                });
           

七大參數

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          timeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler)
           
  1. corePoolSize

    線程池中的窗柱核心線程數

  2. maximumPoolSize

    線程池能夠容納同時執行的最大線程數,此值必須大于等于一;

  3. keepAliveTime

    多餘的空閑線程的存活時間。(當線程池線程數量超過corePoolSize時,空閑時間達到keepAliveTime時會被銷毀直到剩下corePoolSize個線程為止)

  4. unit

    keepAliveTime的機關

  5. workQueue

    任務隊列,被送出但尚未執行的任務

  6. threadFactory

    表示生成線程池中工作線程的線程工廠,用于建立線程一般用預設的即可

  7. handler

    拒絕政策,表示當隊列滿了并且工作線程大于等于線程池的最大線程數(maximumPoolSize)

拒絕政策

  1. AbortPolicy(預設)

    直接抛出RejectedExecutionException異常,阻止系統正常運作

  2. CallerRunsPolicy

    “調用者運作” 一種調節機制,不抛異常也不抛棄任務,而是将某任務回退給調用者。

  3. DiscardOldestPolicy

    抛棄隊列中等待最久的任務,将新任務加入隊列,嘗試再次送出

  4. DiscardPolicy

    直接丢棄任務,不予任何處理(如果允許丢棄,此方案最佳)

面試填坑

前面不是說有三種使用線程池的方式嗎。那你平時用哪個比較多?

回答:三選一 ×

回答:哪個都不用,我一般都會使用

ThreadPoolExecutor(int corePoolSize,

int maximumPoolSize,

long keepAliveTime,

timeUnit unit,

BlockingQueue workQueue,

ThreadFactory threadFactory,

RejectedExecutionHandler handler)

自定義線程池的一些參數。

因為上述三種方法,預設阻塞隊列雖說是有界的但是,最大值是Integer.MAX不太現實。

是以我們需要手動傳入一些參數,來保證業務的正常運作。

尚矽谷Java大廠面試題全集(java面試,周陽主講)-Java面試_大廠高頻面試題_陽哥---------學習筆記