让和hadoop的设计思想是一样的,Master负责分配任务和获取任务的结果,worker是真正处理业务逻辑的。

使用ConcurrentLikedQueue去承载所有的任务,因为会有多个worker会并发修改这个队列。

  1. public class Task {
  2.  
  3. private int id;
  4. private int price ;
  5. public int getId() {
  6. return id;
  7. }
  8. public void setId(int id) {
  9. this.id = id;
  10. }
  11. public int getPrice() {
  12. return price;
  13. }
  14. public void setPrice(int price) {
  15. this.price = price;
  16. }
  17.  
  18. }
  1. public class Master {
  2.  
  3. //1 有一个盛放任务的容器
  4. private ConcurrentLinkedQueue<Task> workQueue = new ConcurrentLinkedQueue<Task>();
  5.  
  6. //2 需要有一个盛放worker的集合
  7. private HashMap<String, Thread> workers = new HashMap<String, Thread>();
  8.  
  9. //3 需要有一个盛放每一个worker执行任务的结果集合
  10. private ConcurrentHashMap<String, Object> resultMap = new ConcurrentHashMap<String, Object>();
  11.  
  12. //4 构造方法
  13. public Master(Worker worker , int workerCount){
  14. worker.setWorkQueue(this.workQueue);
  15. worker.setResultMap(this.resultMap);
  16.  
  17. for(int i = 0; i < workerCount; i ++){
  18. this.workers.put(Integer.toString(i), new Thread(worker));
  19. }
  20.  
  21. }
  22.  
  23. //5 需要一个提交任务的方法
  24. public void submit(Task task){
  25. this.workQueue.add(task);
  26. }
  27.  
  28. //6 需要有一个执行的方法,启动所有的worker方法去执行任务
  29. public void execute(){
  30. for(Map.Entry<String, Thread> me : workers.entrySet()){
  31. me.getValue().start();
  32. }
  33. }
  34.  
  35. //7 判断是否运行结束的方法
  36. public boolean isComplete() {
  37. for(Map.Entry<String, Thread> me : workers.entrySet()){
  38. if(me.getValue().getState() != Thread.State.TERMINATED){
  39. return false;
  40. }
  41. }
  42. return true;
  43. }
  44.  
  45. //8 计算结果方法
  46. public int getResult() {
  47. int priceResult = 0;
  48. for(Map.Entry<String, Object> me : resultMap.entrySet()){
  49. priceResult += (Integer)me.getValue();
  50. }
  51. return priceResult;
  52. }
  53. }
  1. public class Worker implements Runnable {
  2.  
  3. private ConcurrentLinkedQueue<Task> workQueue;
  4. private ConcurrentHashMap<String, Object> resultMap;
  5.  
  6. public void setWorkQueue(ConcurrentLinkedQueue<Task> workQueue) {
  7. this.workQueue = workQueue;
  8. }
  9.  
  10. public void setResultMap(ConcurrentHashMap<String, Object> resultMap) {
  11. this.resultMap = resultMap;
  12. }
  13.  
  14. @Override
  15. public void run() {
  16. while(true){
  17. Task input = this.workQueue.poll();
  18. if(input == null) break;
  19. Object output = handle(input);
  20. this.resultMap.put(Integer.toString(input.getId()), output);
  21. }
  22. }
  23.  
  24. private Object handle(Task input) {
  25. Object output = null;
  26. try {
  27. //处理任务的耗时。。 比如说进行操作数据库。。。
  28. Thread.sleep(500);
  29. output = input.getPrice();
  30. } catch (InterruptedException e) {
  31. e.printStackTrace();
  32. }
  33. return output;
  34. }
  35.  
  36. }
  1. public class Main {
  2.  
  3. public static void main(String[] args) {
  4.  
  5. Master master = new Master(new Worker(), 20);
  6.  
  7. Random r = new Random();
  8. for(int i = 1; i <= 100; i++){
  9. Task t = new Task();
  10. t.setId(i);
  11. t.setPrice(r.nextInt(1000));
  12. master.submit(t);
  13. }
  14. master.execute();
  15. long start = System.currentTimeMillis();
  16.  
  17. while(true){
  18. if(master.isComplete()){
  19. long end = System.currentTimeMillis() - start;
  20. int priceResult = master.getResult();
  21. System.out.println("最终结果:" + priceResult + ", 执行时间:" + end);
  22. break;
  23. }
  24. }
  25.  
  26. }
  27. }

Master和worker模式的更多相关文章

  1. Spark技术内幕:Client,Master和Worker 通信源码解析

    http://blog.csdn.net/anzhsoft/article/details/30802603 Spark的Cluster Manager可以有几种部署模式: Standlone Mes ...

  2. Spark技术内幕:Client,Master和Worker 通信源代码解析

    Spark的Cluster Manager能够有几种部署模式: Standlone Mesos YARN EC2 Local 在向集群提交计算任务后,系统的运算模型就是Driver Program定义 ...

  3. Apache的prefork模式和worker模式(转)

    prefork模式这个多路处理模块(MPM)实现了一个非线程型的.预派生的web服务器,它的工作方式类似于Apache 1.3.它适合于没有线程安全库,需要避免线程兼容性问题的系统.它是要求将每个请求 ...

  4. Apache的prefork模式和worker模式

    prefork模式这个多路处理模块(MPM)实现了一个非线程型的.预派生的web服务器,它的工作方式类似于Apache 1.3.它适合于没有线程安全库,需要避免线程兼容性问题的系统.它是要求将每个请求 ...

  5. Spark中master与worker的进程RPC通信实现

    1.构建master的actor package SparkRPC import akka.actor.{Actor, ActorSystem, Props}import com.typesafe.c ...

  6. Spark分析之Master、Worker以及Application三者之间如何建立连接

    Master.preStart(){ webUi.bind() context.system.scheduler.schedule( millis, WORKER_TIMEOUT millis, se ...

  7. [PHP] apache在worker模式配置fastcgi使用php-fpm

    1.准备: dpkg -L apache2查看所有安装的apache2的应用 a2query -M查看apache2使用的模式 httpd -l旧版本查看当前apache模式 2.查看apache的进 ...

  8. redis配置master-slave模式

    由于云服务器存在闪断现象,项目线上会存在基于redis的功能在闪断时段内出现异常,所以redis需要做master-slave模式.直接上代码: 原单机redis,RedisConnectionFac ...

  9. Ubuntu下配置Apache的Worker模式

    其实Apache本身的并发能力是足够强大的,但是Ubuntu默认安装的是Prefork模式下的Apache.所以导致很多人后面盲目的去 安装lighttpd或者nginx一类替代软件.但是这类软件有一 ...

随机推荐

  1. Vuejs+axios+SpringMVC 1

    原文:https://blog.csdn.net/annghi/article/details/78925668 Vuejs+axios+SpringMVC4.3.7 (一) 2017年12月28日 ...

  2. dubbo与springcloud对比与面试

    对比:具体见此博客: http://www.sohu.com/a/108961261_468650 dubbo:组装机 springcloud:品牌机 打个不恰当的比喻:使用Dubbo构建的微服务架构 ...

  3. UVAL 7902 2016ECfinal F - Mr. Panda and Fantastic Beasts

    题意: 给出n个串,求一个最短的第一个串的子串使它不在其他的n-1个串中出现,若有多个求字典序最小的. Limits: • 1 ≤ T ≤ 42. • 2 ≤ N ≤ 50000. • N ≤ S1 ...

  4. 2017年Java面试题整理

    原文出处:CSDN邓帅 面试是我们每个人都要经历的事情,大部分人且不止一次,这里给大家总结最新的2016年面试题,让大家在找工作时候能够事半功倍. 1.Switch能否用string做参数? a.在 ...

  5. js 正则表达式 整数或小数

    非零开头的整数或小数 /^[1-9][0-9]*([.][0-9]+)?$/ 非零开头的整数或两位小数 /^[1-9][0-9]*([.][0-9]{1,2})?$/ /^[1-9][0-9]*([. ...

  6. HDU 3802 矩阵快速幂 化简递推式子 加一点点二次剩余知识

    求$G(a,b,n,p) = (a^{\frac {p-1}{2}}+1)(b^{\frac{p-1}{2}}+1)[(\sqrt{a} + \sqrt{b})^{2F_n} + (\sqrt{a} ...

  7. Java并发编程原理与实战四十:JDK8新增LongAdder详解

    传统的原子锁AtomicLong/AtomicInt虽然也可以处理大量并发情况下的计数器,但是由于使用了自旋等待,当存在大量竞争时,会存在大量自旋等待,而导致CPU浪费,而有效计算很少,降低了计算效率 ...

  8. Maven项目中通过profile定义使不同环境使用不同配置信息

    profile可以让我们定义一系列的配置信息,然后指定其激活条件.这样我们就可以定义多个profile,然后每个profile对应不同的激活条件和配置信息,从而达到不同环境使用不同配置信息的效果.比如 ...

  9. 20155210潘滢昊 2016-2017-2 《Java程序设计》第5周学习总结

    20155210 2016-2017-2 <Java程序设计>第5周学习总结 教材学习内容总结 try with resources 关闭多个资源时用分号分隔 java.lang.Auto ...

  10. 微服务深入浅出(6)-- 熔断器Hystrix

    概念 在分布式系统中,一种不可避免的情况就是某些服务会出现故障,导致依赖他们的其他服务出现远程调度的线程问题(雪崩效应).而Hystrix提供的熔断器,通过隔离服务的访问点,能阻止这种分布式系统中出现 ...