2016 - 2024

感恩一路有你

多线程post工具 多线程间怎么传递数据?

浏览量:2852 时间:2023-04-03 20:15:24 作者:采采

多线程间怎么传递数据?

多线程传递多个参数可以通过以下方法来实现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来处理。

任务 线程 队列 参数 corePoolSize

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。