卖逼视频免费看片|狼人就干网中文字慕|成人av影院导航|人妻少妇精品无码专区二区妖婧|亚洲丝袜视频玖玖|一区二区免费中文|日本高清无码一区|国产91无码小说|国产黄片子视频91sese日韩|免费高清无码成人网站入口

多線程post工具 多線程間怎么傳遞數(shù)據(jù)?

多線程間怎么傳遞數(shù)據(jù)?多線程傳遞多個(gè)參數(shù)可以通過以下方法來實(shí)現(xiàn)typedefstruct{void*arg1void*arg2//加個(gè)semaphore}ARGvoidfunc(void*arg1,v

多線程間怎么傳遞數(shù)據(jù)?

多線程傳遞多個(gè)參數(shù)可以通過以下方法來實(shí)現(xiàn)typedefstruct{void*arg1void*arg2//加個(gè)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ù)表,它包含有任意多個(gè)(含0個(gè),即沒有)參數(shù)說明項(xiàng),當(dāng)多于一個(gè)時(shí)其前后兩個(gè)參數(shù)說明項(xiàng)之間必須用逗號(hào)分開。每個(gè)參數(shù)說明項(xiàng)由一種已定義的數(shù)據(jù)類型和一個(gè)變量標(biāo)識(shí)符組成,該變量標(biāo)識(shí)符稱為該函數(shù)的形式參數(shù),簡(jiǎn)稱形參,形參前面給出的數(shù)據(jù)類型稱為該形參的類型。一個(gè)函數(shù)定義中的可以被省略,表明該函數(shù)為無參函數(shù),若用void取代,則也表明是無參函數(shù),若不為空,同時(shí)又不是保留字void,則稱為帶參函數(shù)。

線程池隊(duì)列大小設(shè)置?

一、ThreadPoolExecutor的重要參數(shù)

corePoolSize:核心線程數(shù),核心線程會(huì)一直存活,及時(shí)沒有任務(wù)需要執(zhí)行,當(dāng)線程數(shù)小于核心線程數(shù)時(shí),即使有線程中午休息,線程池也會(huì)優(yōu)先創(chuàng)建新線程處理,設(shè)置allowCoreThreadTimeouttrue(默認(rèn)false)時(shí),核心線程會(huì)超時(shí)關(guān)閉

queueCapacity:任務(wù)隊(duì)列容量(阻塞隊(duì)列)

當(dāng)核心線程數(shù)達(dá)到最大時(shí),新任務(wù)會(huì)放在隊(duì)列中排隊(duì)等待執(zhí)行

maxPoolSize:最大線程數(shù)

當(dāng)線程數(shù)gtcorePoolSize,且任務(wù)隊(duì)列已滿時(shí)。線程池會(huì)創(chuàng)建新線程來處理任務(wù)

當(dāng)線程數(shù)maxPoolSize,且任務(wù)隊(duì)列已滿時(shí),線程池會(huì)拒絕處理任務(wù)而拋出異常

keepAliveTime:線程晚上時(shí)間

當(dāng)線程空余時(shí)間達(dá)到keepAliveTime時(shí),線程會(huì)退出,直到線程數(shù)量corePoolSize

如果allowCoreThreadTimeouttrue,則會(huì)直到線程數(shù)量0

allowCoreThreadTimeout:允許核心線程超時(shí)

rejectedExecutionHandler:任務(wù)拒絕處理器芯片

兩種情況會(huì)拒絕處理任務(wù):

當(dāng)線程數(shù)已經(jīng)達(dá)到maxPoolSize,切隊(duì)列已滿,會(huì)拒絕新任務(wù)

當(dāng)線程池被調(diào)用shutdown()后,會(huì)等待線程池里的任務(wù)執(zhí)行完畢,再shutdown。如果在調(diào)用shutdown()和線程池真正shutdown之間提交任務(wù),會(huì)拒絕新任務(wù)

線程池會(huì)調(diào)用rejectedExecutionHandler來處理這個(gè)任務(wù)。如果沒有設(shè)置默認(rèn)是AbortPolicy,會(huì)拋出異常

ThreadPoolExecutor類有幾個(gè)內(nèi)部實(shí)現(xiàn)類來處理這類情況:

AbortPolicy丟棄任務(wù),拋運(yùn)行時(shí)異常

CallerRunsPolicy執(zhí)行任務(wù)

DiscardPolicy忽視,什么都不會(huì)發(fā)生

DiscardOldestPolicy從隊(duì)列中踢出最先進(jìn)入隊(duì)列(最后一個(gè)執(zhí)行)的任務(wù)

實(shí)現(xiàn)RejectedExecutionHandler接口,可自定義處理器

二、ThreadPoolExecutor執(zhí)行順序

線程池按以下行為執(zhí)行任務(wù)

(1)當(dāng)線程數(shù)小于核心線程數(shù)時(shí),創(chuàng)建線程。

(2)當(dāng)線程數(shù)大于等于核心線程數(shù),且任務(wù)隊(duì)列未滿時(shí),將任務(wù)放入任務(wù)隊(duì)列。

(3)當(dāng)線程數(shù)大于等于核心線程數(shù),且任務(wù)隊(duì)列已滿

1)若線程數(shù)小于最大線程數(shù),創(chuàng)建線程

2)若線程數(shù)等于最大線程數(shù),拋出異常,拒絕任務(wù)

三、如何設(shè)置參數(shù)

默認(rèn)值

corePoolSize1

_VALUE

_VALUE

keepAliveTime60s

allowCoreThreadTimeoutfalse

rejectedExecutionHandlerAbortPolicy()

如何來設(shè)置

需要根據(jù)幾個(gè)值來決定

tasks:每秒的任務(wù)數(shù),假設(shè)為500~1000

taskcost:每個(gè)任務(wù)花費(fèi)時(shí)間,假設(shè)為0.1s

responsetime:系統(tǒng)允許容忍的最大響應(yīng)時(shí)間,假設(shè)為3s

做幾個(gè)計(jì)算

corePoolSize每秒需要多少個(gè)線程處理?

threadcounttasks/(1/taskcost)tasks*taskcout(500~1000)*0.150~100個(gè)線程。corePoolSize設(shè)置應(yīng)該大于50

根據(jù)8020原則,如果80%的每秒任務(wù)數(shù)小于800,那么corePoolSize設(shè)置為80即可

queueCapacity(coreSizePool/taskcost)*responsetime

計(jì)算可得queueCapacity80/0.1*180。意思是隊(duì)列里的線程可以等待12s,超過了的需要新開線程來執(zhí)行

切記不能設(shè)置為_VALUE,這樣隊(duì)列會(huì)很大,線程數(shù)只會(huì)保持在corePoolSize大小,當(dāng)任務(wù)陡增時(shí),不能新開線程來執(zhí)行,響應(yīng)時(shí)間會(huì)隨之陡增。

maxPoolSize(max(tasks)-queueCapacity)/(1/taskcost)

計(jì)算可得maxPoolSize(1000-80)/1092

(最大任務(wù)數(shù)-隊(duì)列容量)/每個(gè)線程每秒處理能力最大線程數(shù)

rejectedExecutionHandler:根據(jù)具體情況來決定,任務(wù)不重要可丟棄,任務(wù)重要?jiǎng)t要利用一些緩沖機(jī)制來處理

keepAliveTime和allowCoreThreadTimeout采用默認(rèn)通常能滿足

以上都是理想值,實(shí)際情況下要根據(jù)機(jī)器性能來決定。如果在未達(dá)到最大線程數(shù)的情況機(jī)器npuload已經(jīng)滿了,則需要通過升級(jí)硬件和優(yōu)化代碼,降低taskcost來處理。