多線程post工具 多線程間怎么傳遞數(shù)據?
多線程間怎么傳遞數(shù)據?多線程傳遞多個參數(shù)可以通過以下方法來實現(xiàn)typedefstruct{void*arg1void*arg2//加個semaphore}ARGvoidfunc(void*arg1,v
多線程間怎么傳遞數(shù)據?
多線程傳遞多個參數(shù)可以通過以下方法來實現(xiàn)typedefstruct{void*arg1void*arg2//加個semaphore}ARGvoidfunc(void*arg1,void*arg2){ARGaarg1arg2//初始化0pthread_create(amptid,routine,NULL,ampa)//wait}void*routine(void*arg){ARG*a(ARG*)argvoid*arg1a-gtarg1void*arg2a-gtarg2//post}參數(shù)表又稱形式參數(shù)表,它包含有任意多個(含0個,即沒有)參數(shù)說明項,當多于一個時其前后兩個參數(shù)說明項之間必須用逗號分開。每個參數(shù)說明項由一種已定義的數(shù)據類型和一個變量標識符組成,該變量標識符稱為該函數(shù)的形式參數(shù),簡稱形參,形參前面給出的數(shù)據類型稱為該形參的類型。一個函數(shù)定義中的可以被省略,表明該函數(shù)為無參函數(shù),若用void取代,則也表明是無參函數(shù),若不為空,同時又不是保留字void,則稱為帶參函數(shù)。
線程池隊列大小設置?
一、ThreadPoolExecutor的重要參數(shù)
corePoolSize:核心線程數(shù),核心線程會一直存活,及時沒有任務需要執(zhí)行,當線程數(shù)小于核心線程數(shù)時,即使有線程中午休息,線程池也會優(yōu)先創(chuàng)建新線程處理,設置allowCoreThreadTimeouttrue(默認false)時,核心線程會超時關閉
queueCapacity:任務隊列容量(阻塞隊列)
當核心線程數(shù)達到最大時,新任務會放在隊列中排隊等待執(zhí)行
maxPoolSize:最大線程數(shù)
當線程數(shù)gtcorePoolSize,且任務隊列已滿時。線程池會創(chuàng)建新線程來處理任務
當線程數(shù)maxPoolSize,且任務隊列已滿時,線程池會拒絕處理任務而拋出異常
keepAliveTime:線程晚上時間
當線程空余時間達到keepAliveTime時,線程會退出,直到線程數(shù)量corePoolSize
如果allowCoreThreadTimeouttrue,則會直到線程數(shù)量0
allowCoreThreadTimeout:允許核心線程超時
rejectedExecutionHandler:任務拒絕處理器芯片
兩種情況會拒絕處理任務:
當線程數(shù)已經達到maxPoolSize,切隊列已滿,會拒絕新任務
當線程池被調用shutdown()后,會等待線程池里的任務執(zhí)行完畢,再shutdown。如果在調用shutdown()和線程池真正shutdown之間提交任務,會拒絕新任務
線程池會調用rejectedExecutionHandler來處理這個任務。如果沒有設置默認是AbortPolicy,會拋出異常
ThreadPoolExecutor類有幾個內部實現(xiàn)類來處理這類情況:
AbortPolicy丟棄任務,拋運行時異常
CallerRunsPolicy執(zhí)行任務
DiscardPolicy忽視,什么都不會發(fā)生
DiscardOldestPolicy從隊列中踢出最先進入隊列(最后一個執(zhí)行)的任務
實現(xiàn)RejectedExecutionHandler接口,可自定義處理器
二、ThreadPoolExecutor執(zhí)行順序
線程池按以下行為執(zhí)行任務
(1)當線程數(shù)小于核心線程數(shù)時,創(chuàng)建線程。
(2)當線程數(shù)大于等于核心線程數(shù),且任務隊列未滿時,將任務放入任務隊列。
(3)當線程數(shù)大于等于核心線程數(shù),且任務隊列已滿
1)若線程數(shù)小于最大線程數(shù),創(chuàng)建線程
2)若線程數(shù)等于最大線程數(shù),拋出異常,拒絕任務
三、如何設置參數(shù)
默認值
corePoolSize1
_VALUE
_VALUE
keepAliveTime60s
allowCoreThreadTimeoutfalse
rejectedExecutionHandlerAbortPolicy()
如何來設置
需要根據幾個值來決定
tasks:每秒的任務數(shù),假設為500~1000
taskcost:每個任務花費時間,假設為0.1s
responsetime:系統(tǒng)允許容忍的最大響應時間,假設為3s
做幾個計算
corePoolSize每秒需要多少個線程處理?
threadcounttasks/(1/taskcost)tasks*taskcout(500~1000)*0.150~100個線程。corePoolSize設置應該大于50
根據8020原則,如果80%的每秒任務數(shù)小于800,那么corePoolSize設置為80即可
queueCapacity(coreSizePool/taskcost)*responsetime
計算可得queueCapacity80/0.1*180。意思是隊列里的線程可以等待12s,超過了的需要新開線程來執(zhí)行
切記不能設置為_VALUE,這樣隊列會很大,線程數(shù)只會保持在corePoolSize大小,當任務陡增時,不能新開線程來執(zhí)行,響應時間會隨之陡增。
maxPoolSize(max(tasks)-queueCapacity)/(1/taskcost)
計算可得maxPoolSize(1000-80)/1092
(最大任務數(shù)-隊列容量)/每個線程每秒處理能力最大線程數(shù)
rejectedExecutionHandler:根據具體情況來決定,任務不重要可丟棄,任務重要則要利用一些緩沖機制來處理
keepAliveTime和allowCoreThreadTimeout采用默認通常能滿足
以上都是理想值,實際情況下要根據機器性能來決定。如果在未達到最大線程數(shù)的情況機器npuload已經滿了,則需要通過升級硬件和優(yōu)化代碼,降低taskcost來處理。