更新時間:2020-10-27 17:47:15 來源:動力節(jié)點 瀏覽1723次
想要一個程序能快速高效的運行,對CPU的合理使用是關(guān)鍵。因為運行程序在本質(zhì)上是系統(tǒng)資源的使用,JVM線程池就是一種利用CPU的優(yōu)化方式,如何高效的使用這些資源是我們編程優(yōu)化演進(jìn)的一個方向。下面我們來講一講關(guān)于JVM線程池基礎(chǔ)知識。
提交一個任務(wù)到線程池中,JVM線程池的處理流程如下:
1、判斷線程池里的核心線程是否都在執(zhí)行任務(wù),如果不是(核心線程空閑或者還有核心線程沒有被創(chuàng)建)則創(chuàng)建一個新的工作線程來執(zhí)行任務(wù)。如果核心線程都在執(zhí)行任務(wù),則進(jìn)入下個流程。
2、線程池判斷工作隊列是否已滿,如果工作隊列沒有滿,則將新提交的任務(wù)存儲在這個工作隊列里。如果工作隊列滿了,則進(jìn)入下個流程。
3、判斷線程池里的線程是否都處于工作狀態(tài),如果沒有,則創(chuàng)建一個新的工作線程來執(zhí)行任務(wù)。如果已經(jīng)滿了,則交給飽和策略來處理這個任務(wù)。
在線程池中,有如下五個參數(shù)是需要知道的:
1、corePoolSize(線程池基本大小):當(dāng)向線程池提交一個任務(wù)時,若線程池已創(chuàng)建的線程數(shù)小于corePoolSize,即便此時存在空閑線程,也會通過創(chuàng)建一個新線程來執(zhí)行該任務(wù),直到已創(chuàng)建的線程數(shù)大于或等于corePoolSize時,(除了利用提交新任務(wù)來創(chuàng)建和啟動線程(按需構(gòu)造),也可以通過 prestartCoreThread() 或 prestartAllCoreThreads() 方法來提前啟動線程池中的基本線程。)
2、maximumPoolSize(線程池最大大小):線程池所允許的最大線程個數(shù)。當(dāng)隊列滿了,且已創(chuàng)建的線程數(shù)小于maximumPoolSize,則線程池會創(chuàng)建新的線程來執(zhí)行任務(wù)。另外,對于無界隊列,可忽略該參數(shù)。
3、keepAliveTime(線程存活保持時間)當(dāng)線程池中線程數(shù)大于核心線程數(shù)時,線程的空閑時間如果超過線程存活時間,那么這個線程就會被銷毀,直到線程池中的線程數(shù)小于等于核心線程數(shù)。
4、workQueue(任務(wù)隊列):用于傳輸和保存等待執(zhí)行任務(wù)的阻塞隊列。
5、threadFactory(線程工廠):用于創(chuàng)建新線程。threadFactory創(chuàng)建的線程也是采用new Thread()方式,threadFactory創(chuàng)建的線程名都具有統(tǒng)一的風(fēng)格:pool-m-thread-n(m為線程池的編號,n為線程池內(nèi)的線程編號)。
JVM線程池的簡單使用,以下代碼,是在Java中創(chuàng)建線程池:
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提供給外部的接口也很簡單,直接調(diào)用ThreadPoolExecutor構(gòu)造一個就可以了,也可以通過Executors靜態(tài)工廠構(gòu)建,可以看到,開發(fā)者想要在代碼中使用線程池還是比較簡單的。
今天學(xué)習(xí)的關(guān)于JVM線程池必會基礎(chǔ)知識就是上面的內(nèi)容了,希望可以對java零基礎(chǔ)的朋友們學(xué)習(xí)線程池有所幫助。對于線程池,除了知道原理和一些參數(shù)外,大家可以在java教程中學(xué)習(xí)怎樣布置線程池,因為更重要的是要會在代碼中合理使用線程池,從而高效的運行程序。
初級 202925
初級 203221
初級 202629
初級 203743