对于高并发的任务,有些任务是相互独立的,任务与任务之间没有依赖关系,因此可以采用 master - worker 模式。

master 用于接受任务和分发任务给 worker,并将 worker 返回的结果组装返回给调用方。因此该模式是异步的。

要用到组件有:任务队列、任务和worker线程映射、任务和结果集映射

private ConcurrentLinkedQueue<Task> taskQueue = new ConcurrentLinkedQueue<>();
private HashMap<String, Runnable> taskThreadMap = new HashMap<>();
private ConcurrentHashMap<String, Result> taskResultMap = new ConcurrentHashMap<>();

对于任务队列,master 用于接受任务, worker 线程从任务集中取任务,涉及到多 worker 线程操作同一任务集,因此需要使用线程安全的集合 ConcurrentLinkedQueue。

任务和worker线程映射 用于限制 worker 线程数量,在 master 中控制。因为只有一个 master 线程,因此不需要使用线程安全的集合类。

任务和结果集映射 用于 worker 将结果返回给 master 线程。涉及到多个 worker 线程,因此需要使用线程安全的 ConcurrentHashMap 保存任务和结果的映射。

多线程高效合作之master-warker模式的更多相关文章

  1. puppet(5)-master/agent模式

    master/agent模式的工作流程 agent每隔固定时长会向master端发送nodename(自己的节点名,节点名至关重要)和 facts ,并且向服务器端请求自己的catalog. mast ...

  2. jenkins的Master/Slave模式

    一. Master/Slave模式 分担jenkins服务器的压力,任务分配到其它执行机来执行 Master:Jenkins服务器 Slave:执行机(奴隶机).执行Master分配的任务,并返回任务 ...

  3. Puppet基于Master/Agent模式实现LNMP平台部署

    前言 随着IT行业的迅猛发展,传统的运维方式靠大量人力比较吃力,运维人员面对日益增长的服务器和运维工作,不得不把很多重复的.繁琐的工作利用自动化处理.前期我们介绍了运维自动化工具ansible的简单应 ...

  4. Jenkins—Master/Slave模式

    Jenkins可部署在windows或者linux平台上,项目系统的用户多数为windows系统.如果Jenkins部署在linux上,而自动化任务要在windows平台执行,那么就需要使用Jenki ...

  5. MySQL master/slave 模式

    1 .复制 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的 数据复制到其它主机(slaves)上,并重 ...

  6. ActiveMQ集群支持Master/Slave模式

    现在ActiveMQ, 在Failover方面有两种解决方案:Pure Master Slave和Shared File System Master Slave.      先看Pure Master ...

  7. java多线程系列15 设计模式 生产者 - 消费者模式

    生产者-消费者 生产者消费者模式是一个非常经典的多线程模式,比如我们用到的Mq就是其中一种具体实现 在该模式中 通常会有2类线程,消费者线程和生产者线程 生产者提交用户请求 消费者负责处理生产者提交的 ...

  8. day11(多线程,唤醒机制,生产消费者模式,多线程的生命周期)

    A:进程: 进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. B:线程: 线程是进程中的一个执行单元,负责当前进程中程序的执 ...

  9. 多线程调试必杀技 - GDB的non-stop模式

     作者:破砂锅  (转) 开源的GDB被广泛使用在Linux.OSX.Unix和各种嵌入式系统(例如手机),这次它又带给我们一个惊喜. 多线程调试之痛 调试器(如VS2008和老版GDB)往往只支持a ...

随机推荐

  1. 排序算法的c++实现——快速排序

    快速排序是分治思想的又一典型代表,是应用最广的排序算法.分治思想就是把原问题的解分解为两个或多个子问题解,求解出子问题的解之后再构造出原问题的解. 在快速排序算法中,它的思想是把一个待排序的数组分成前 ...

  2. Flink Time深度解析(转)

    Flink 的 API 大体上可以划分为三个层次:处于最底层的 ProcessFunction.中间一层的 DataStream API 和最上层的 SQL/Table API,这三层中的每一层都非常 ...

  3. 不知道密码情况下 进行docker数据库可视化连接

    1. 通过命令 docker inpect mysql容器id ,查询mysql容器的密码和绑定的端口号 2.通过vscode插件或者navicat等可视化工具,进行连接即可. 有问题请进群联系我,或 ...

  4. 微服务框架---搭建 go-micro环境

    1.安装micro 需要使用GO1.11以上版本 #linux 下 export GO111MODULE=on export GOPROXY=https://goproxy.io # windows下 ...

  5. Linux运维技术之yum与rpm的基本使用要点

    https://pkgs.org/ 与https://rpmfind.org/   RPM包下载 RPM包简介 1.安装与升级时,使用的是包全名 2.RPM包安装时要注意包的依赖性 RPM包操作(系统 ...

  6. NetEQ主要文件简介

    accelerate.h,accelerate.cc 加速操作,对语音信号处理以实现快速播放. Accelerate类继承自父类TimeStretch,大多数功能由TimeStretch实现. Ret ...

  7. sed命令基本用法

    sed是一个非交互式文本编辑器,它可对文本文件和标准输入进行编辑sed 适用于以下三种场合:编辑相对交互式文本编辑器而言太大的文件编辑命令太复杂,在交互式文本编辑器中难以输入的情况对文本扫描一遍,但是 ...

  8. git更换仓库,保留分支,保留提交记录及开发权限

    别人推荐的方法都很复杂,这个步骤自己亲自尝试过,非常简单好用. 1.从原地址克隆一份裸版本库,比如原本托管于 GitHub. git clone --bare https://github....(原 ...

  9. Oracle逻辑导入数据(IMP/IMPDP)

    使用IMPDP导入数据的前提是数据是使用EMPDP导出的,同样也是在DOS窗口下直接输入IMPDP和登录数据库的用户名,即可导人数据. impdp导到指定用户下: impdp student/1234 ...

  10. js-Cannot read property 'innerHTML' of null

    原因:1.$('#xxx') 或$('.xxx')不存在 2.$('#xxx')或$('.xxx')的值为空