線程池的底層原理 Executors源碼:

public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue()); } public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue())); } public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue()); } public ThreadPoolExecutor(int corePoolSize, //線程池中的常駐核心線程數 int maximumPoolSize, //線程池能容納同時執行的最大線程數,此值必須大於等於1 long keepAliveTime, //多餘的空閒線程的存活時間,當前池中線程數量超過corePoolSize時,當空閒時間達到keepAliveTime時,多餘線程就會被銷燬到只剩下corePoolSize為止 TimeUnit unit, //keepAliveTime的單位 BlockingQueue workQueue, //任務隊列,被提交但尚未執行的任務 ThreadFactory threadFactory, //創建線程的工廠,默認即可 RejectedExecutionHandler handler //拒絕策略,當隊列滿(maximumPoolSize)時,根據該handler決定如何拒絕請求執行的runnable ) { ..... .... ... } 一鍵獲取完整項目代碼 java

線程池工作原理: 線程池工作圖解析:

線程池工作流程:

線程池工作流程:

1、在創建了線程池後,開始等待請求。

2、當調用execute()方法添加一個請求任務時,線程池會做出如下判斷:

2.1如果正在運行的線程數量小於corePoolSize,那麼馬上創建線程運行這個任務;

2.2如果正在運行的線程數量大於或等corePoolSize,那麼將這個任務放入隊列;

2.3如果這個時候隊列滿了且正在運行的線程數量還小於maximumPoolSize,那麼還是要創建非核心線程立刻運行這個任 務;

2.4如果隊列滿了且正在運行的線程數量大於或等於maximumPoolSize,那麼線程池會啓動飽和拒絕策略來執行。

3、當一個線程完成任務時,它會從隊列中取下一個任務來執行。

4、當一個線程無事可做超過一定的時間(keepAliveTime)時,線程會判斷:

如果當前運行的線程數大於corePoolSize,那麼這個線程就被停掉。所以線程池的所有任務完成後,它最終會收縮

corePoolSize的大小。

注意:

在工作中單一的/固定的/可變的三種創建線程池的方法哪個用的多?

答: 一個都不用

OOM java虛擬機內存溢出異常 ———————————————— 版權聲明:本文為CSDN博主「向着五星的方向」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/qq_69748833/article/details/137297131