Java多线程MasterWorker模式如何在高并发情况下优化

Java多线程MasterWorker模式,是常用的并行模式之一,核心思想是由两类进程协助完成的,Master进程负责接收和分配任务并处理保存结果集,Worker负责处理... Java多线程MasterWorker模式,是常用的并行模式之一,核心思想是由两类进程协助完成的,Master 进程负责接收和分配任务并处理保存结果集,Worker 负责处理任务, 并把结果返回给Master 进程。但是高并发的情况下,如果1个Master对应3个Worker,1秒请求有500个,每个请求new 1个Master,那就会new 1500个Worker了,内存不一定支持这样的情况,有没有好的方案优化 展开
 我来答
澈丶233
2019-10-17 · TA获得超过169个赞
知道小有建树答主
回答量:446
采纳率:94%
帮助的人:105万
展开全部

你说的Master指的是java的线程池吧,我之前做过一个项目,因为项目在内网拿不出来,我给你说一下我那次的经验。

几个关键点:

1、java线程池:使用java提供的ThreadPoolExecutor类构造主池,再构造一个辅池(辅池的作用在于当主池进入拒绝策略的时候,可以启动辅池,帮助主池分担一部分线程,或者在主池shutdown的瞬间又有任务进来,也会走到拒绝策略,此时可以启动辅池处理这些线程,一般情况下辅池不会启动),排队策略使用LinkedBlockingQueue队列。

2、单例模式:利用spring的IOC容器的单例性,每次取线程池时,从IOC容器中注入。创建一个组件类BatPool(spring组件默认为单例),里面再使用单例模式创建线程池,单例中的单例,保证单例性:


@Component

class BatPool{

private ThreadPoolExecutor mainPool;

ThreadPoolExecutor create(){

if(mainPool== null){

   retrun new ThreadPoolExecutor();

}else{

 retrun mainPool;

}

...

}


业务中:

@Autowired

BatPool batPool;

ThreadPoolExecutor pool = batPool.create();

...


线程池的配置你自己参考网上吧

这样在业务中,每次取到的池都是同一个池,不会多次创建。

如果你没有使用spring的话,我再想想办法怎么实现全局的单例模式

飘零城市楼台V
2019-10-17 · 超过16用户采纳过TA的回答
知道答主
回答量:44
采纳率:0%
帮助的人:4.9万
展开全部
Master-Worker是常见的并行设计模式。
核心思想是: 系统中有两个进程协议工作。Master进程负责接收和分配任务,Worker负责处理子任务。当worker进程将子任务处理完毕之后,将结果返回给Master进程,由Master进行归纳和汇总。
优势:可以将大任务分解成若干小任务,并发执行,从而提高系统性能。对于客户端(请求发起者)来说,任务一旦提交,Master进程就会立刻分配任务并立刻返回,并不会等待系统处理完再返回,其处理过程是异步的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式