Java多线程MasterWorker模式如何在高并发情况下优化
你说的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的话,我再想想办法怎么实现全局的单例模式
核心思想是: 系统中有两个进程协议工作。Master进程负责接收和分配任务,Worker负责处理子任务。当worker进程将子任务处理完毕之后,将结果返回给Master进程,由Master进行归纳和汇总。
优势:可以将大任务分解成若干小任务,并发执行,从而提高系统性能。对于客户端(请求发起者)来说,任务一旦提交,Master进程就会立刻分配任务并立刻返回,并不会等待系统处理完再返回,其处理过程是异步的。