Java Thread系列(九)Master-Worker模式

Master-Worker模式是常用的并行设计模式.

一、Master-Worker 模式核心思想

Master-Worker 系统由两个角色组成,Master 和 Worker,Master 负责接收和分配任务,Worker 负责处理子任务。任务处理过程中,Master 还负责监督任务进展和 Worker 的健康状态;Master 将接收 Client 提交的任务,并将任务的进展汇总反馈给 Client。各角色关系如下图:

二、Master-Worker 实现

(1) Master

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedDeque; public class Master {
//1. 应该有一个容器存放任务列表,这个容器需要支持高并发操作
private ConcurrentLinkedDeque<Task> taskQueue = new ConcurrentLinkedDeque<Task>(); //2. 应该有一个容器存放worker
private HashMap<String, Thread> workers = new HashMap<String, Thread>(); //3. 应该有一个容器存放结果集,这个容器需要支持高并发操作
private ConcurrentHashMap<String, Object> resultMap = new ConcurrentHashMap<String, Object>(); //4. 构造函数
public Master (Worker worker, int threadCount) {
//将任务列表和结果集传递给worker
worker.setTaskQueue(taskQueue);
worker.setResultMap(resultMap);
//初始化worder列表
for (int i = 0; i < threadCount; i++) {
workers.put("worker-" + i, new Thread(worker));
}
} public Master (Worker worker) {
this(worker, Runtime.getRuntime().availableProcessors());
} //5. 提交任务
public void submit (Task task) {
taskQueue.add(task);
} //6. 执行方法 开启所有的线程
public void execute () {
for(Map.Entry<String, Thread> me : workers.entrySet()) {
me.getValue().start();
}
} //7. 判断是否执行完毕
public boolean isComplete () {
for(Map.Entry<String, Thread> me : workers.entrySet()) {
if (me.getValue().getState() != Thread.State.TERMINATED)
return false;
}
return true;
} //8. 处理结果集
public int getResult () {
int ret = 0;
for(Map.Entry<String, Object> me : resultMap.entrySet()) {
ret += (int)me.getValue();
}
return ret;
}
}

(2) Worker

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedDeque; public class Worker implements Runnable { private ConcurrentLinkedDeque<Task> taskQueue;
private ConcurrentHashMap<String, Object> resultMap; @Override
public void run() {
while (true) {
Task task = taskQueue.poll();
if (task == null) break; try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
//返回结果集
resultMap.put(Integer.toString(task.getId()), handle(task));
}
} private Object handle(Task task) {
return task.getCount();
} public void setTaskQueue(ConcurrentLinkedDeque<Task> taskQueue) {
this.taskQueue = taskQueue;
} public void setResultMap(ConcurrentHashMap<String, Object> resultMap) {
this.resultMap = resultMap;
}
}

(3) Task

public class Task {
private int id;
private String name;
private int count; public Task() {}
public Task(int id, String name, int count) {
this.id = id;
this.name = name;
this.count = count;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
@Override
public String toString() {
return "Task{" + "id=" + id + ", name='" + name + '\'' +
", count=" + count + '}';
}
}

(4) 测试

Master master = new Master(new Worker(), 1);

for (int i = 1; i <= 100; i++) {
master.submit(new Task(i, "task-" + i ,i));
} master.execute(); long t1 = System.currentTimeMillis();
while (true) {
if (master.isComplete()) {
long t = System.currentTimeMillis() - t1;
System.out.printf("执行结果:%s;执行时间:%s", master.getResult(), t);
break;
}
}

每天用心记录一点点。内容也许不重要,但习惯很重要!

Java Thread系列(九)Master-Worker模式的更多相关文章

  1. Java Thread系列(十)Future 模式

    Java Thread系列(十)Future 模式 Future 模式适合在处理很耗时的业务逻辑时进行使用,可以有效的减少系统的响应时间,提高系统的吞吐量. 一.Future 模式核心思想 如下的请求 ...

  2. Java Thread系列(十)生产者消费者模式

    Java Thread系列(十)生产者消费者模式 生产者消费者问题(producer-consumer problem),是一个多线程同步问题的经典案例.该问题描述了两个共亨固定大小缓冲区的线程-即所 ...

  3. Java Thread系列(七)死锁

    Java Thread系列(七)死锁 当线程需要同时持有多个锁时,有可能产生死锁.考虑如下情形: 线程 A 当前持有互斥所锁 lock1,线程 B 当前持有互斥锁 lock2.接下来,当线程 A 仍然 ...

  4. java多线程系列(九)---ArrayBlockingQueue源码分析

    java多线程系列(九)---ArrayBlockingQueue源码分析 目录 认识cpu.核心与线程 java多线程系列(一)之java多线程技能 java多线程系列(二)之对象变量的并发访问 j ...

  5. Java Thread系列(四)线程通信

    Java Thread系列(四)线程通信 一.传统通信 public static void main(String[] args) { //volatile实现两个线程间数据可见性 private ...

  6. Java Thread系列(五)synchronized

    Java Thread系列(五)synchronized synchronized锁重入 关键字 synchronized 拥有锁重入的功能,也就是在使用 synchronized 时,当线程等到一个 ...

  7. Java Thread系列(三)线程安全

    Java Thread系列(三)线程安全 一.什么是线程安全 线程安全概念:当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法)就是线程安全的. 线程安全来 ...

  8. Java Thread系列(二)线程状态

    Java Thread系列(二)线程状态 一.线程的五种状态 新建状态(New):新创建了一个线程对象,尚未启动. 就绪状态(Runnable):也叫可运行状态.线程对象创建后,其他线程调用了该对象的 ...

  9. Java Thread系列(一)线程创建

    Java Thread系列(一)线程创建 Java 中创建线程主要有三种方式:继承 Thread.实现 Runnable 接口.使用 ExecutorService.Callable.Future 实 ...

随机推荐

  1. C# 判断操作系统的位数

    判断操作系统的位数有一下几种方法: 1. 特征值IntPtr 2. WMI 1的实现如下: public static int GetOSInfo() { if (IntPtr.Size == 8) ...

  2. mysql学习--基本使用

    一旦安装完毕,MySQL 服务器应该自己主动启动. sudo start mysql #手动的话这样启动 sudo stop mysql #手动停止 当你改动了配置文件后,你须要重新启动 mysqld ...

  3. RabbitMQ 概念与Java例子

    RabbitMQ简介 目前RabbitMQ是AMQP 0-9-1(高级消息队列协议)的一个实现,使用Erlang语言编写,利用了Erlang的分布式特性. 概念介绍: Broker:简单来说就是消息队 ...

  4. 洛谷3343(ZJOI2015)地震后的幻想乡

    题目:https://www.luogu.org/problemnew/show/P3343 1.那个时间与边的大小排名有关,所以需要求一下最大边的期望排名就行. 2.期望排名是这样算的:(排名为1的 ...

  5. mybatis 高级映射 简单例子

    1.建表 DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `gender` ) NOT NULL, `name` ) NOT NULL, `id` ...

  6. SCSI协议

    SCSI是一套完整的数据传输协议,其主要功能是在主机和存储设备之间传送命令.状态和块数据.在各类存储技术中,SCSI技术可谓是最重要的脊梁. SCSI协议位于操作系统和外部资源之间,它具有一系列的功能 ...

  7. 学习blus老师js(2)--深入JavaScript

    1.函数传参 可变参(不定参):arguments 参数的个数可变,参数数组   例1.求和 求所有参数的和 <!DOCTYPE HTML> <html> <head&g ...

  8. jquery对象和DOM对象转换

    DOM对象转换成jquery对象 var box = document.getElementById('box'); console.log($(box)); jquery对象转化成DOM对象 第一种 ...

  9. apache 搭建PHP多站点

    修改apache 配置文件:httpd.conf 1.默认 Listen 80端口 2.添加配置如下: <VirtualHost *:80> ServerAdmin admin@yii.c ...

  10. 「小程序JAVA实战」小程序的视频展示页面初始化(63)

    转自:https://idig8.com/2018/09/24/xiaochengxujavashizhanxiaochengxudeshipinzhanshiyemianchushihua62/ 进 ...