多线程post工具 多线程间怎么传递数据?
多线程间怎么传递数据?
多线程传递多个参数可以通过以下方法来实现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}参数表又称形式参数表,它包含有任意多个(含0个,即没有)参数说明项,当多于一个时其前后两个参数说明项之间必须用逗号分开。每个参数说明项由一种已定义的数据类型和一个变量标识符组成,该变量标识符称为该函数的形式参数,简称形参,形参前面给出的数据类型称为该形参的类型。一个函数定义中的可以被省略,表明该函数为无参函数,若用void取代,则也表明是无参函数,若不为空,同时又不是保留字void,则称为带参函数。
线程池队列大小设置?
一、ThreadPoolExecutor的重要参数
corePoolSize:核心线程数,核心线程会一直存活,及时没有任务需要执行,当线程数小于核心线程数时,即使有线程中午休息,线程池也会优先创建新线程处理,设置allowCoreThreadTimeouttrue(默认false)时,核心线程会超时关闭
queueCapacity:任务队列容量(阻塞队列)
当核心线程数达到最大时,新任务会放在队列中排队等待执行
maxPoolSize:最大线程数
当线程数gtcorePoolSize,且任务队列已满时。线程池会创建新线程来处理任务
当线程数maxPoolSize,且任务队列已满时,线程池会拒绝处理任务而抛出异常
keepAliveTime:线程晚上时间
当线程空余时间达到keepAliveTime时,线程会退出,直到线程数量corePoolSize
如果allowCoreThreadTimeouttrue,则会直到线程数量0
allowCoreThreadTimeout:允许核心线程超时
rejectedExecutionHandler:任务拒绝处理器芯片
两种情况会拒绝处理任务:
当线程数已经达到maxPoolSize,切队列已满,会拒绝新任务
当线程池被调用shutdown()后,会等待线程池里的任务执行完毕,再shutdown。如果在调用shutdown()和线程池真正shutdown之间提交任务,会拒绝新任务
线程池会调用rejectedExecutionHandler来处理这个任务。如果没有设置默认是AbortPolicy,会抛出异常
ThreadPoolExecutor类有几个内部实现类来处理这类情况:
AbortPolicy丢弃任务,抛运行时异常
CallerRunsPolicy执行任务
DiscardPolicy忽视,什么都不会发生
DiscardOldestPolicy从队列中踢出最先进入队列(最后一个执行)的任务
实现RejectedExecutionHandler接口,可自定义处理器
二、ThreadPoolExecutor执行顺序
线程池按以下行为执行任务
(1)当线程数小于核心线程数时,创建线程。
(2)当线程数大于等于核心线程数,且任务队列未满时,将任务放入任务队列。
(3)当线程数大于等于核心线程数,且任务队列已满
1)若线程数小于最大线程数,创建线程
2)若线程数等于最大线程数,抛出异常,拒绝任务
三、如何设置参数
默认值
corePoolSize1
_VALUE
_VALUE
keepAliveTime60s
allowCoreThreadTimeoutfalse
rejectedExecutionHandlerAbortPolicy()
如何来设置
需要根据几个值来决定
tasks:每秒的任务数,假设为500~1000
taskcost:每个任务花费时间,假设为0.1s
responsetime:系统允许容忍的最大响应时间,假设为3s
做几个计算
corePoolSize每秒需要多少个线程处理?
threadcounttasks/(1/taskcost)tasks*taskcout(500~1000)*0.150~100个线程。corePoolSize设置应该大于50
根据8020原则,如果80%的每秒任务数小于800,那么corePoolSize设置为80即可
queueCapacity(coreSizePool/taskcost)*responsetime
计算可得queueCapacity80/0.1*180。意思是队列里的线程可以等待12s,超过了的需要新开线程来执行
切记不能设置为_VALUE,这样队列会很大,线程数只会保持在corePoolSize大小,当任务陡增时,不能新开线程来执行,响应时间会随之陡增。
maxPoolSize(max(tasks)-queueCapacity)/(1/taskcost)
计算可得maxPoolSize(1000-80)/1092
(最大任务数-队列容量)/每个线程每秒处理能力最大线程数
rejectedExecutionHandler:根据具体情况来决定,任务不重要可丢弃,任务重要则要利用一些缓冲机制来处理
keepAliveTime和allowCoreThreadTimeout采用默认通常能满足
以上都是理想值,实际情况下要根据机器性能来决定。如果在未达到最大线程数的情况机器npuload已经满了,则需要通过升级硬件和优化代码,降低taskcost来处理。
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。