博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Master-Worker模式
阅读量:5760 次
发布时间:2019-06-18

本文共 3462 字,大约阅读时间需要 11 分钟。

Master-Worker模式

  将某一部分的功能的系统分成两个角色Master、Worker来处理请求。

  Master它的职能是负责客户端发送过来的请求、反馈回处理的结果以及分配任务。Worker它的职能就是处理子任务并把结果反馈给Master。这一模式和古代的分封制度有点类似。

  

    就如上图Master对任务进行切分,并放入任务队列;然后,触发Worker处理任务。Master只做任务的接收、切分和结果统计,指定Worker的数量和性能指标,但不参与Worker的实际管理,而是交由第三方调度监控和调度Worker。这样我们就可以将一个比较大的任务分成一个个小任务来处理,大大提高了系统的性能。在上述的图片中,我们不一定要使用上述的容器,自己可以根据情况而选择。

public class MasterMain {    public static void main(String[] args) {        Master master=new Master(new Worker(),10);        for (int i=10;i<=100;i++){            Task task=new Task();            task.setId(i);            task.setName("task"+i);            task.setPrice(i);            master.submit(task);        }        master.execute();        long start=System.currentTimeMillis();        while(true){            if(master.isExist()){                long end=System.currentTimeMillis()-start;                long result=master.getResult();                System.out.println("任务执行时间为:"+end+"====结果集为:"+result);                break;            }        }    }}
public class Master {    //1.承接任务的集合    ConcurrentLinkedQueue workqueue=new ConcurrentLinkedQueue();    //2.使用hashmap去承装所有的worker对象    private HashMap
workers=new HashMap<>(); //3.使用一个容器承装每一个workers并发执行任务的结果集 private ConcurrentHashMap
resultMap=new ConcurrentHashMap<>(); //4.构造方法 public Master(Worker worker,int workerCount){ //每个worker对象都需要有Master的引用,workqueue用于任务的领取,resultMap用于任务的提交 worker.setWorkerQueue(workqueue); worker.setResultMap(resultMap); for(int i=0;i
work:workers.entrySet()){ work.getValue().start(); } } //判断是否结束 public boolean isExist(){ for(Map.Entry
exist: workers.entrySet()){ if(exist.getValue().getState() !=Thread.State.TERMINATED){ return false; } } return true; } //返回结果集 public long getResult(){ long result=0L; for (Map.Entry
re:resultMap.entrySet()){ result+=(Integer) re.getValue(); } return result; }}
public class Worker implements Runnable {    private ConcurrentLinkedQueue workerQueue;    private  ConcurrentHashMap
resultMap; public void setWorkerQueue(ConcurrentLinkedQueue
workerQueue){ this.workerQueue=workerQueue; } public void setResultMap(ConcurrentHashMap
resultMap){ this.resultMap=resultMap; } @Override public void run() { while(true){ Task task= (Task) workerQueue.poll(); if(task==null) break;//说明没有任务了 //处理业务 Object result = handle(task); //将结果集放到resultMap中 resultMap.put(Integer.toString(task.getId()),result); } } private Object handle(Task task){ Object result=null; try { Thread.sleep(500); result=task.getPrice(); } catch (InterruptedException e) { e.printStackTrace(); } return result; }}
public class Task {    private  int id;    private  String name;    private  int price;    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 getPrice() {        return price;    }    public void setPrice(int price) {        this.price = price;    }}

 

转载于:https://www.cnblogs.com/jxgo/p/7792097.html

你可能感兴趣的文章
盘点2018云计算市场,变化大于需求?
查看>>
极光推送(一)集成
查看>>
MySQL 8.0 压缩包版安装方法
查看>>
@Transient注解输出空间位置属性
查看>>
Ansible-playbook 条件判断when、pause(学习笔记二十三)
查看>>
编码服务正在步入云端
查看>>
5种你未必知道的JavaScript和CSS交互的方法(转发)
查看>>
线程进程间通信机制
查看>>
galera mysql 多主复制启动顺序及命令
查看>>
JS prototype 属性
查看>>
中位数性质——数列各个数到中位数的距离和最小
查看>>
WebApp之Meta标签
查看>>
添加Java文档注释
查看>>
Python3批量爬取网页图片
查看>>
iphone-common-codes-ccteam源代码 CCEncoding.m
查看>>
微信公众平台开发(96) 多个功能整合
查看>>
[转]MVC4项目中验证用户登录一个特性就搞定
查看>>
用Perl编写Apache模块续二 - SVN动态鉴权实现SVNAuth 禅道版
查看>>
Android 阴影,圆形的Button
查看>>
C++概述
查看>>