當前位置:首頁 » 硬碟大全 » java緩存線程池的最大線程數
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

java緩存線程池的最大線程數

發布時間: 2023-02-14 20:44:11

① java應用中可以有多少 線程池

可以有多少個線程池的問題,如果假設每個線程池中只有一個線程,那麼就轉化為應用中可以有多少個線程
這個跟jvm的配置,操作系統相關
每個線程在jvm中默認是分配1m大小的內存,當然可以調整,因此這個可用線程數的多少跟你操作系統目前剩餘內存有關
同時一個操作系統中最大的線程數一般為3000-5000,當然理論值是這樣,如果線程數過大,會有調度方面的延遲,導致大數量級的線程反而比小數量級的線程運行得更慢。

② 線程池七大核心參數

線程池七大核心參數如下所示:

一、corePoolSize 線程池核心線程大小

線程池中會維護一個最小的線程數量,即使這些線程處理空閑狀態,他們也不會被銷毀,除非設置了allowCoreThreadTimeOut。這里的最小線程數量即是corePoolSize。任務提交到線程池後,首先會檢查當前線程數是否達到了corePoolSize,如果沒有達到的話,則會創建一個新線程來處理這個任務。

二、maximumPoolSize 線程池最大線程數量

當前線程數達到corePoolSize後,如果繼續有任務被提交到線程池,會將任務緩存到工作隊列(後面會介紹)中。如果隊列也已滿,則會去創建一個新線程來出來這個處理。線程池不會無限制的去創建新線程,它會有一個最大線程數量的限制,這個數量即由maximunPoolSize指定。

三、keepAliveTime 空閑線程存活時間

一個線程如果處於空閑狀態,並且當前的線程數量大於corePoolSize,那麼在指定時間後,這個空閑線程會被銷毀,這里的指定時間由keepAliveTime來設定。

四、unit 空閑線程存活時間單位

空閑線程存活時間單位是keepAliveTime的計量單位。

五、workQueue 工作隊列

新任務被提交後,會先進入到此工作隊列中,任務調度時再從隊列中取出任務。

六、threadFactory 線程工廠

創建一個新線程時使用的工廠,可以用來設定線程名、是否為daemon線程等等。

七、handler 拒絕策略

當工作隊列中的任務已到達最大限制,並且線程池中的線程數量也達到最大限制,這時如果有新任務提交進來,該如何處理呢。這里的拒絕策略,就是解決這個問題的。

線程池的優勢

1、線程和任務分離,提升線程重用性;

2、控制線程並發數量,降低伺服器壓力,統一管理所有線程;

3、提升系統響應速度,假如創建線程用的時間為T1,執行任務用的時間為T2,銷毀線程用的時間為T3,那麼使用線程池就免去了T1和T3的時間。

③ Java 線程池的問題

你的理解沒毛病。

核心線程數(corePoolSize):核心線程會一直存活,即使沒有任務需要處理。當線程數小於核心線程數時,即使現有的線程空閑,線程池也會優先創建新線程來處理任務,而不是直接交給現有的線程處理。

最大線程數(maxPoolSize):當線程數大於或等於核心線程,且任務隊列已滿時,線程池會創建新的線程,直到線程數量達到maxPoolSize。如果線程數已等於maxPoolSize,且任務隊列已滿,則已超出線程池的處理能力,線程池會拒絕處理任務而拋出異常。

線程池按以下行為執行任務

  • 當線程數小於核心線程數時,創建線程。

  • 當線程數大於等於核心線程數,且任務隊列未滿時,將任務放入任務隊列。

  • 當線程數大於等於核心線程數,且任務隊列已滿,1、若線程數小於最大線程數,創建線程;2、若線程數等於最大線程數,拋出異常,拒絕任務

④ java如何確定線程池最多線程的大小

corePoolSize(線程池的基本大小):當提交一個任務到線程池時,線程池會創建一個線程來執行任務,即使其他空閑的基本線程能夠執行新任務也會創建線程,等到需要執行的任務數大於線程池基本大小時就不再創建。如果調用了線程池的prestartAllCoreThreads方法,線程池會提前創建並啟動所有基本線程。
runnableTaskQueue(任務隊列):用於保存等待執行的任務的阻塞隊列。 可以選擇以下幾個阻塞隊列。
ArrayBlockingQueue:是一個基於數組結構的有界阻塞隊列,此隊列按 FIFO(先進先出)原則對元素進行排序。
LinkedBlockingQueue:一個基於鏈表結構的阻塞隊列,此隊列按FIFO (先進先出) 排序元素,吞吐量通常要高於ArrayBlockingQueue。靜態工廠方法Executors.newFixedThreadPool()使用了這個隊列。
SynchronousQueue:一個不存儲元素的阻塞隊列。每個插入操作必須等到另一個線程調用移除操作,否則插入操作一直處於阻塞狀態,吞吐量通常要高於LinkedBlockingQueue,靜態工廠方法Executors.newCachedThreadPool使用了這個隊列。
PriorityBlockingQueue:一個具有優先順序的無限阻塞隊列。
maximumPoolSize(線程池最大大小):線程池允許創建的最大線程數。如果隊列滿了,並且已創建的線程數小於最大線程數,則線程池會再創建新的線程執行任務。值得注意的是如果使用了無界的任務隊列這個參數就沒什麼效果。
ThreadFactory:用於設置創建線程的工廠,可以通過線程工廠給每個創建出來的線程設置更有意義的名字。
RejectedExecutionHandler(飽和策略):當隊列和線程池都滿了,說明線程池處於飽和狀態,那麼必須採取一種策略處理提交的新任務。這個策略默認情況下是AbortPolicy,表示無法處理新任務時拋出異常。以下是JDK1.5提供的四種策略。
AbortPolicy:直接拋出異常。
CallerRunsPolicy:只用調用者所在線程來運行任務。
DiscardOldestPolicy:丟棄隊列里最近的一個任務,並執行當前任務。
DiscardPolicy:不處理,丟棄掉。
當然也可以根據應用場景需要來實現RejectedExecutionHandler介面自定義策略。如記錄日誌或持久化不能處理的任務。
keepAliveTime(線程活動保持時間):線程池的工作線程空閑後,保持存活的時間。所以如果任務很多,並且每個任務執行的時間比較短,可以調大這個時間,提高線程的利用率。
TimeUnit(線程活動保持時間的單位):可選的單位有天(DAYS),小時(HOURS),分鍾(MINUTES),毫秒(MILLISECONDS),微秒(MICROSECONDS, 千分之一毫秒)和毫微秒(NANOSECONDS, 千分之一微秒)。

⑤ 我需要一個java線程池的例子,比如說我設置線程池最大線程數為20

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Test
{
public static void main(String[] args) throws InterruptedException
{
ExecutorService exe = Executors.newFixedThreadPool(5);
for (int i = 1; i <= 50; i++)
{
exe.execute(new SubThread(i));
}
System.out.println("shutdown");
exe.shutdown();
while (true)
{
if (exe.isTerminated())
{
System.out.println("結束了!");
break;
}
Thread.sleep(200);
}
}
}

public class SubThread extends Thread
{
private final int i;

public SubThread(int i)
{
this.i = i;
}

@Override
public void run()
{
System.out.println(i);
try
{
Thread.sleep(2000);
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}

⑥ java線程池中的線程數應該如何設置

java中線程池的監控可以檢測到正在執行的線程數。
通過線程池提供的參數進行監控。線程池裡有一些屬性在監控線程池的時候可以使用
taskCount:線程池需要執行的任務數量。
completedTaskCount:線程池在運行過程中已完成的任務數量。小於或等於taskCount。
largestPoolSize:線程池曾經創建過的最大線程數量。通過這個數據可以知道線程池是否滿過。如等於線程池的最大大小,則表示線程池曾經滿了。
getPoolSize:線程池的線程數量。如果線程池不銷毀的話,池裡的線程不會自動銷毀,所以這個大小隻增不+ getActiveCount:獲取活動的線程數。
通過擴展線程池進行監控。通過繼承線程池並重寫線程池的beforeExecute,afterExecute和terminated方法,我們可以在任務執行前,執行後和線程池關閉前干一些事情。如監控任務的平均執行時間,最大執行時間和最小執行時間等。這幾個方法在線程池裡是空方法。如:
protected void beforeExecute(Thread t, Runnable r) { }

⑦ java 線程池中corepoolsize=5 maximumpoolsize=5,最大可存放線程怎麼是10

應該是5個,
corepoolsize=5初始空閑線程5個,
maximumpoolsize=5最大線程數為5

⑧ java系統最大並發線程數大概是多少

樓主你好,cup的多線程指的是真正意義上的可以同時運行的線程數,各線程並行運行。但是Java中的並發線程指的是在一個進程中分時復用cpu的資源,只是在宏觀上看來是同時運行的,兩者是有區別的。理論上java最大的並發線程沒有數量上的限制,但是開啟一個線程是很耗系統資源的,如果並發量太大就會導致系統資源不足而死機,所以我們一般會用線程池的技術來控制線程的數量,也可以提高並發的效率,如果感興趣,你可以看看線程池相關的資料。

⑨ 超詳細的線程池使用解析

Java 中線程池是運用場景最多的並發框架,幾乎所有需要非同步或並發執行任務的程序都可以使用線程池。合理的使用線程池可以帶來多個好處:

(1) 降低資源消耗 。通過重復利用已創建的線程降低線程在創建和銷毀時造成的消耗。

(2) 提高響應速度 。當處理執行任務時,任務可以不需要等待線程的創建就能立刻執行。

(3) 提高線程的可管理性 。線程是稀缺資源,如果無限制的創建,不僅會消耗系統資源,還會降低系統的穩定性,使用線程池可以進行統一分配、調優和監控。

線程池的處理流程如上圖所示

線程池中通過 ctl 欄位來表示線程池中的當前狀態,主池控制狀態 ctl 是 AtomicInteger 類型,包裝了兩個概念欄位:workerCount 和 runState,workerCount 表示有效線程數,runState 表示是否正在運行、正在關閉等狀態。使用 ctl 欄位表示兩個概念,ctl 的前 3 位表示線程池狀態,線程池中限制 workerCount 為(2^29 )-1(約 5 億)個線程,而不是 (2^31)-1(20 億)個線程。workerCount 是允許啟動和不允許停止的工作程序的數量。該值可能與實際的活動線程數暫時不同,例如,當 ThreadFactory 在被詢問時未能創建線程時,以及退出線程在終止前仍在執行記時。用戶可見的池大小報告為工作集的當前大小。 runState 提供主要的生命周期控制,取值如下表所示:

runState 隨著時間的推移而改變,在 awaitTermination() 方法中等待的線程將在狀態達到 TERMINATED 時返回。狀態的轉換為:

RUNNING -> SHUTDOWN 在調用 shutdown() 時,可能隱含在 finalize() 中

(RUNNING 或 SHUTDOWN)-> STOP 在調用 shutdownNow() 時

SHUTDOWN -> TIDYING 當隊列和線程池都為空時

STOP -> TIDYING 當線程池為空時

TIDYING -> TERMINATED 當 terminate() 方法完成時

開發人員如果需要在線程池變為 TIDYING 狀態時進行相應的處理,可以通過重載 terminated() 函數來實現。

結合上圖說明線程池 ThreadPoolExecutor 執行流程,使用 execute() 方法提交任務到線程池中執行時分為4種場景:

(1)線程池中運行的線程數量小於 corePoolSize,創建新線程來執行任務。

(2)線程池中運行線程數量不小於 corePoolSize,將任務加入到阻塞隊列 BlockingQueue。

(3)如果無法將任務加入到阻塞隊列(隊列已滿),創建新的線程來處理任務(這里需要獲取全局鎖)。

(4)當創建新的線程數量使線程池中當前運行線程數量超過 maximumPoolSize,線程池中拒絕任務,調用 RejectedExecutionHandler.rejectedExecution() 方法處理。

源碼分析:

線程池創建線程時,會將線程封裝成工作線程 Worker,Worker 在執行完任務後,還會循環獲取工作隊列里的任務來執行。

創建線程池之前,首先要知道創建線程池中的核心參數:

corePoolSize (核心線程數大小):當提交任務到線程池時,線程池會創建一個線程來執行任務,即使其他空閑的基本線程能夠執行新任務也會創建線程,直到需要執行的任務數大於核心線程數時就不再創建。

runnableTaskQueue (任務隊列):用於保存等待執行任務的阻塞隊列。一般選擇以下幾種:

ArrayBlockingQueue:基於數組的有界阻塞隊列,按照 FIFO 原則對元素進行排序。

LinkedBlockingQueue:基於鏈表的阻塞隊列,按照 FIFO 原則對元素進行排序。

SynchronousQueue:同步阻塞隊列,也是不存儲元素的阻塞隊列。每一個插入操作必須要等到另一個 線程調用移除操作,否則插入操作一直處於阻塞狀態。

PriorityBlockingQueue:優先阻塞隊列,一個具有優先順序的無限阻塞隊列。

maximumPoolSize (最大線程數大小):線程池允許創建的最大線程數,當隊列已滿,並且線程池中的線程數小於最大線程數,則線程池會創建新的線程執行任務。當使用無界隊列時,此參數無用。

RejectedExecutionHandler (拒絕策略):當任務隊列和線程池都滿了,說明線程池處於飽和狀態,那麼必須使用拒絕策略來處理新提交的任務。JDK 內置拒絕策略有以下 4 種:

AbortPolicy:直接拋出異常

CallerRunsPolicy:使用調用者所在的線程來執行任務

DiscardOldestPolicy:丟棄隊列中最近的一個任務來執行當前任務

DiscardPolicy:直接丟棄不處理

可以根據應用場景來實現 RejectedExecutionHandler 介面自定義處理策略。

keepAliveTime (線程存活時間):線程池的工作線程空閑後,保持存活的時間。

TimeUnit (存活時間單位):可選單位DAYS(天)、HOURS(小時)、MINUTES(分鍾)、MILLISECONDS(毫秒)、MICROSECONDS(微妙)、NANOSECONDS(納秒)。

ThreadFactory (線程工廠):可以通過線程工廠給創建出來的線程設置有意義的名字。

創建線程池主要分為兩大類,第一種是通過 Executors 工廠類創建線程池,第二種是自定義創建線程池。根據《阿里java開發手冊》中的規范,線程池不允許使用 Executors 去創建,原因是規避資源耗盡的風險。

創建一個單線程化的線程池

創建固定線程數的線程池

以上兩種創建線程池方式使用鏈表阻塞隊列來存放任務,實際場景中可能會堆積大量請求導致 OOM

創建可緩存線程池

允許創建的線程數量最大為 Integer.MAX_VALUE,當創建大量線程時會導致 CPU 處於重負載狀態和 OOM 的發生

向線程池提交任務可以使用兩個方法,分別為 execute() 和 submit()。

execute() 方法用於提交不需要返回值的任務,所以無法判斷任務是否被線程池執行成功。execute() 方法中傳入的是 Runnable 類的實例。

submit() 方法用於提交需要返回值的任務。線程池會返回一個 Future 類型的對象,通過 future 對象可以判斷任務是否執行成功,並且可以通過 future 的 get() 方法來獲取返回值。get() 方法會阻塞當前線程直到任務完成,使用 get(long timeout, TimeUnit unit)方法會阻塞當前線程一段時間後立即返回,這時候可能任務沒有執行完。

可以通過調用線程池的 shutdown() 或shutdownNow() 方法來關閉線程池。他們的原理是遍歷線程池中的工作線程,然後逐個調用 interrupt() 方法來中斷線程,所以無法響應中斷任務可能永遠無法終止。

shutdown() 和 shutdownNow() 方法的區別在於 shutdownNow 方法首先將線程池的狀態設置為 STOP,然後嘗試停止正在執行或暫停任務的線程,並返回等待執行任務的列表,而 shutdown 只是將線程池的狀態設置成 SHUTDOWN 狀態,然後中斷所有沒有正在執行任務的線程。

線程池使用面臨的核心的問題在於: 線程池的參數並不好配置 。一方面線程池的運行機制不是很好理解,配置合理需要強依賴開發人員的個人經驗和知識;另一方面,線程池執行的情況和任務類型相關性較大,IO 密集型和 CPU 密集型的任務運行起來的情況差異非常大,這導致業界並沒有一些成熟的經驗策略幫助開發人員參考。

(1)以任務型為參考的簡單評估:

假設線程池大小的設置(N 為 CPU 的個數)

如果純計算的任務,多線程並不能帶來性能提升,因為 CPU 處理能力是稀缺的資源,相反導致較多的線程切換的花銷,此時建議線程數為 CPU 數量或+1;----為什麼+1?因為可以防止 N 個線程中有一個線程意外中斷或者退出,CPU 不會空閑等待。

如果是 IO 密集型應用, 則線程池大小設置為 2N+1. 線程數 = CPU 核數 目標 CPU 利用率 (1 + 平均等待時間 / 平均工作時間)

(2)以任務數為參考的理想狀態評估:

1)默認值

2)如何設置 * 需要根據相關值來決定 - tasks :每秒的任務數,假設為500~1000 - taskCost:每個任務花費時間,假設為0.1s - responsetime:系統允許容忍的最大響應時間,假設為1s

以上都為理想值,實際情況下要根據機器性能來決定。如果在未達到最大線程數的情況機器 cpu load 已經滿了,則需要通過升級硬體和優化代碼,降低 taskCost 來處理。

(僅為簡單的理想狀態的評估,可作為線程池參數設置的一個參考)

與主業務無直接數據依賴的從業務可以使用非同步線程池來處理,在項目初始化時創建線程池並交給將從業務中的任務提交給非同步線程池執行能夠縮短響應時間。

嚴禁在業務代碼中起線程!!!

當任務需要按照指定順序(FIFO, LIFO, 優先順序)執行時,推薦創建使用單線程化的線程池。

本文章主要說明了線程池的執行原理和創建方式以及推薦線程池參數設置和一般使用場景。在開發中,開發人員需要根據業務來合理的創建和使用線程池達到降低資源消耗,提高響應速度的目的。


原文鏈接:https://juejin.cn/post/7067324722811240479

⑩ 線程池的最大線程數是多少

線程池的最大線程數:

1、.net4.0,32位機器最大線程數,每核1023個

2、.net4.0,64位機器最大線程數,每核32768個

3、.net3.0,最大線程數,每核250個

4、.net2.0,最大線程數,每核25個

默認的最小線程數是每核1個。在伺服器端環境,比如iis下的asp.net最小線程數會更大可能超過50。

線程池是一種多線程處理形式,處理過程中將任務添加到隊列,然後在創建線程後自動啟動這些任務。線程池線程都是後台線程。每個線程都使用默認的堆棧大小,以默認的優先順序運行,並處於多線程單元中。如果某個線程在託管代碼中空閑(如正在等待某個事件),則線程池將插入另一個輔助線程來使所有處理器保持繁忙。如果所有線程池線程都始終保持繁忙,但隊列中包含掛起的工作,則線程池將在一段時間後創建另一個輔助線程但線程的數目永遠不會超過最大值。超過最大值的線程可以排隊,但他們要等到其他線程完成後才啟動。

組成部分:

伺服器程序利用線程技術響應客戶請求已經司空見慣,可能您認為這樣做效率已經很高,但您有沒有想過優化一下使用線程的方法。該文章將向您介紹伺服器程序如何利用線程池來優化性能並提供一個簡單的線程池實現。

1、線程池管理器(ThreadPoolManager):用於創建並管理線程池。

2、工作線程(WorkThread):線程池中線程。

3、任務介面(Task):每個任務必須實現的介面,以供工作線程調度任務的執行。

4、任務隊列:用於存放沒有處理的任務。提供一種緩沖機制。