更新時間:2020-10-27 17:47:15 來源:動力節點 瀏覽1614次
想要一個程序能快速高效的運行,對CPU的合理使用是關鍵。因為運行程序在本質上是系統資源的使用,JVM線程池就是一種利用CPU的優化方式,如何高效的使用這些資源是我們編程優化演進的一個方向。下面我們來講一講關于JVM線程池基礎知識。
提交一個任務到線程池中,JVM線程池的處理流程如下:
1、判斷線程池里的核心線程是否都在執行任務,如果不是(核心線程空閑或者還有核心線程沒有被創建)則創建一個新的工作線程來執行任務。如果核心線程都在執行任務,則進入下個流程。
2、線程池判斷工作隊列是否已滿,如果工作隊列沒有滿,則將新提交的任務存儲在這個工作隊列里。如果工作隊列滿了,則進入下個流程。
3、判斷線程池里的線程是否都處于工作狀態,如果沒有,則創建一個新的工作線程來執行任務。如果已經滿了,則交給飽和策略來處理這個任務。
在線程池中,有如下五個參數是需要知道的:
1、corePoolSize(線程池基本大小):當向線程池提交一個任務時,若線程池已創建的線程數小于corePoolSize,即便此時存在空閑線程,也會通過創建一個新線程來執行該任務,直到已創建的線程數大于或等于corePoolSize時,(除了利用提交新任務來創建和啟動線程(按需構造),也可以通過 prestartCoreThread() 或 prestartAllCoreThreads() 方法來提前啟動線程池中的基本線程。)
2、maximumPoolSize(線程池最大大小):線程池所允許的最大線程個數。當隊列滿了,且已創建的線程數小于maximumPoolSize,則線程池會創建新的線程來執行任務。另外,對于無界隊列,可忽略該參數。
3、keepAliveTime(線程存活保持時間)當線程池中線程數大于核心線程數時,線程的空閑時間如果超過線程存活時間,那么這個線程就會被銷毀,直到線程池中的線程數小于等于核心線程數。
4、workQueue(任務隊列):用于傳輸和保存等待執行任務的阻塞隊列。
5、threadFactory(線程工廠):用于創建新線程。threadFactory創建的線程也是采用new Thread()方式,threadFactory創建的線程名都具有統一的風格:pool-m-thread-n(m為線程池的編號,n為線程池內的線程編號)。
JVM線程池的簡單使用,以下代碼,是在Java中創建線程池:
import java.util.concurrent.*;
public class App {
public static void main(String[] args) throws Exception {
ExecutorService executorService = new ThreadPoolExecutor(1, 1,
60L, TimeUnit.SECONDS,
new ArrayBlockingQueue<>(10));
executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println("abcdefg");
}
});
executorService.shutdown();
}
}
Jdk提供給外部的接口也很簡單,直接調用ThreadPoolExecutor構造一個就可以了,也可以通過Executors靜態工廠構建,可以看到,開發者想要在代碼中使用線程池還是比較簡單的。
今天學習的關于JVM線程池必會基礎知識就是上面的內容了,希望可以對java零基礎的朋友們學習線程池有所幫助。對于線程池,除了知道原理和一些參數外,大家可以在java教程中學習怎樣布置線程池,因為更重要的是要會在代碼中合理使用線程池,從而高效的運行程序。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習