专栏首页小鄧子的技术博客专栏Master-Worker模式实现立方和相加

Master-Worker模式实现立方和相加

本文作为,其他文章链接使用,单独参考意义不大。

Master-Worker框架如下,首先实现的Master线程,主要用作分配任务,和返回结果集。

/**
 * Created by Joker on 2015/3/9.
 */
 public class Master {
 //任务队列
 protected Queue<Object> workQueue = new ConcurrentLinkedQueue<Object>();
 //线程队列
 protected Map<String, Thread> threadMap = new HashMap<String, Thread>();
 //子任务处理结果集
 protected Map<String, Object> resultMap = new ConcurrentHashMap<String, Object>();

 public Master(Worker worker, int workerCount) {
     worker.setWorkQueue(workQueue);
     worker.setResultMap(resultMap);
     if (workerCount > 5)
         workerCount = 5;
     /*根据workerCount,创建指定数量的工作线程Worker*/
     for (int i = 0; i < workerCount; i++) {
         threadMap.put(Integer.toString(i), new Thread(worker, Integer.toString(i)));
     }
 }

 /**
  * 检查子任务是否全部执行完毕
  */
 public boolean isComplete() {
     for (Map.Entry<String, Thread> entry : threadMap.entrySet()) {
         if (entry.getValue().getState() != Thread.State.TERMINATED) {
             return false;
         }
     }
     return true;
 }

 /**
  * 提交任务
  */
 public void submit(Object object) {
     workQueue.add(object);
 }

 /**
  * 获取子任务结果集
  *
  * @return 结果集
  */
 public Map<String, Object> getResultMap() {
     return resultMap;
 }

 /**
  * 执行所有工作线程worker,处理任务。
  */
 public void execute() {
     for (Map.Entry<String, Thread> entry : threadMap.entrySet()) {
         entry.getValue().start();
     }
 }
}

Worker作为子线程,实现在Handle方法中实现具体业务逻辑,并加处理结果放到结果集中。

/**
 * Created by Joker on 2015/3/9.
 */
 public class Worker implements Runnable {
 //子任务队列,用于过去子任务
 protected Queue<Object> workQueue;
 //结果集
 protected Map<String, Object> resultMap;
 public void setWorkQueue(Queue<Object> workQueue) {
     this.workQueue = workQueue;
 }

 public void setResultMap(Map<String, Object> resultMap) {
     this.resultMap = resultMap;
 }

 /**
  * 执行具体业务逻辑
  * 模拟立方和计算
  *
  * @param object
  * @return
  */
 public Object handle(Object object) {
     Integer i = (Integer) object;
     return i * i * i;
 }

 @Override
 public void run() {
     while (true) {
         //获取任务
         Object work = workQueue.poll();
         if (work == null)
             break;
         resultMap.put(Integer.toString(work.hashCode()), this.handle(work));
     }
 }
}

需要调用的地方,进行立方和计算。

/**
 * 计算立方和1~100的立方和
 */
public void executeCubic() {

    //创建三个Worker线程,执行任务
    Master master = new Master(new Worker(), 3);

    for (int i = 0; i < 100; i++) {
        master.submit(i);
    }

    //执行任务
    master.execute();
    //计算结果,初始化
    int result = 0;

    //计算结果集
    Map<String, Object> resultMap = master.getResultMap();

    while (resultMap.size() > 0 || !master.isComplete()) {

        String key = null;
        Integer i = null;

        for (String k : resultMap.keySet()) {

            key = k;
            break;
        }

        if (key != null) {
            i = (Integer) resultMap.get(key);
            //从结果集中移除倍计算过的key
            resultMap.remove(key);
        }

        if (i != null) {
            result += i;
        }
    }
}

提交100个任务后由3个Worker线程进行计算,Master并不等待所有Worker线程执行完毕,就开始访问子结果集,进行相加计算,直到子结果集中的所有数据处理完毕,并且3个活跃Worker线程全部停止,才给出最终的立方总和。result最终结果便是1~100立方和。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 三行情诗

    小鄧子
  • 【译】与Adapter一起使用(ListView, GridView, ...)

    首先,我们需要为测试提供一些图像。我们从eatfoody.com截取了部分美味的食谱图,上传至imgur。

    小鄧子
  • 【译】在列表视图中处理空值

    本篇文章主要针对两类开发者。第一个是曾遇到过IllegalArgumentException: Path must not be empty问题的开发者。第二个...

    小鄧子
  • 必须掌握【分布式锁】三种实现方式

    我们在开发应用的时候,如果需要对某一个共享变量进行多线程同步访问的时候,可以使用我们学到的Java多线程的18般武艺进行处理,并且可以完美的运行,毫无Bug!

    田维常
  • 【leetcode算法-无重复字符的最长子串】

    滑动窗口,通过使用 HashSet 作为滑动窗口,我们可以用 O(1) 的时间来完成对字符是否在当前的子字符串中的检查。滑动窗口是数组/字符串问题中常用...

    用户5640963
  • 编写高质量代码改善C#程序的157个建议[勿选List<T>做基类、迭代器是只读的、慎用集合可写属性]

      本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html 。本文主要学习记录以下内容:

    aehyok
  • 用ZooKeeper实现分布式配置中心

    比如我们线上有很多微服务分布在很多服务器上,有一天其中一个微服务比如user-service的ip地址需要变更,而user-service需要对很多其他程序提供...

    行百里er
  • SpringBoot整合JWT认证机制实现接口鉴权

    session登录的认证方案是看,用户从客户端传递用户名和密码登录信息,服务端认证后将信息储存在session中,将session_id放入cookie中,以后...

    泰坦HW
  • 重学 Java 设计模式:实战装饰器模式

    很多人写代码往往是没有编程感觉的,也就是除了可以把功能按照固定的流程编写出流水式的代码外,很难去思考整套功能服务的扩展性和可维护性。尤其是在一些较大型的功能搭建...

    小傅哥
  • mac端的优秀抓包工具——Charles使用 原

            Charles是mac端的一款截取与分析网络请求的工具,在网络开发中使用其作分析,可以大大提高我们的开发效率。Charles是收费软件,一般可以...

    珲少

扫码关注云+社区

领取腾讯云代金券