你對Java線程池瞭解嗎?你有用過線程池嗎?那先說下線程池核心參數吧。。。對不起,我回去再看看吧。java
爲了一絲體面,咱們今天來整理幾個面試中常考線程池面試問題吧!面試
上圖咱們說過,當線程數量大於maximumPoolSize,就會執行飽和策略。ThreadPoolExecutor類中一共有4種飽和策略。經過實現RejectedExecutionHandler接口。微信
下面咱們在代碼中看下飽和策略使用方式。多線程
import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; /** * @author :jiaolian * @date :Created in 2021-02-20 16:28 * @description:線程池丟棄策略 * @modified By: * 公衆號:叫練 */ public class AbortTest { //線程數量 private static final int THREAD_COUNT = 50; private static final CountDownLatch COUNT_DOWN_LATCH = new CountDownLatch(THREAD_COUNT); private static final AtomicInteger ATOMIC_INTEGER = new AtomicInteger(1); //線程池丟棄策略 public static void main(String[] args) throws InterruptedException { //新建一個線程池 ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( 3,5,1, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(20),new ThreadPoolExecutor.AbortPolicy()); //DiscardPolicy 丟棄 //AbortPolicy 丟棄報錯 //DiscardOldestPolicy 將隊列對首的任務丟棄,執行當前線程任務 //CallerRunsPolicy 直接調用run方法 //提交線程 for (int i=0; i<THREAD_COUNT; i++) { threadPoolExecutor.execute(()->{ try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+" execute!"+ATOMIC_INTEGER.getAndIncrement()); COUNT_DOWN_LATCH.countDown(); }); } COUNT_DOWN_LATCH.await(); //關閉線程 threadPoolExecutor.shutdown(); } }
如上代碼:核心線程數量是3,最大線程數量是5,阻塞隊列是20,共提交50個線程,這裏飽和策略用的是AbortPolicy,分析執行線程池過程,線程池中首先開啓3個核心線程Worker,發現3個線程處理不了50個線程任務,因而線程池就向阻塞隊列添加任務,發現仍是阻塞隊列也容納不下50個任務,因而又增長至2個線程同時運行線程任務,一共是5個線程同時運行任務,此時線程池中共有25個任務會被執行,還有25個任務會被丟棄,由於咱們用的是AbortPolicy飽和策略,會報錯,截部分圖以下劃紅線所示。一共執行了25個任務。其餘幾種策略你們能夠參照執行。ide
源碼中ThreadPoolExecutor中有個內置對象Worker,每一個worker都是一個線程,worker線程數量和參數有關,每一個worker會while死循環從阻塞隊列中取數據,經過置換worker中Runnable對象,運行其run方法起到線程置換的效果,這樣作的好處是避免多線程頻繁線程切換,提升程序運行性能。性能
今天咱們介紹了線程池中面試中幾個重要的面試點,整理出來但願能對你有幫助,寫的比不全,同時還有許多須要修正的地方,但願親們加以指正和點評,喜歡的請點贊加關注哦。點關注,不迷路,我是叫練【公衆號】,微信號【jiaolian123abc】邊叫邊練。atom