多线程设计模式之Master-Worker模式

Master- Worker 模式是常用的并行计算模式。它的核心思想是系统由两类进程协作工 作: Master 进程和 Worker 进程。 Master 负责接收和分配任务,Worker 负责处理子任 务。当各个 Worker-子进程处理完成后,会将结果返回给 Master,由 Master 做归纳和总 结。其好处是能将一个大任务分解成若干个小任务,并行执行,从而提高系统的吞吐量。

 案例:Master类里有三个容器:ConcurrentLinkedQueue负责存储任务、Map负责保存Worker线程、ConcurrentHashMap负责存储处理的结果集。Master负责创建多条Worker线程去执行ConcurrentLinkedQueue存储的任务,然后将结果返回到ConcurrentHashMap里,由Master统一处理结果集返回给用户。

public class Master {

    //定义一个 承装所有任务 的容器
    ConcurrentLinkedQueue<Task> taskQueue = new ConcurrentLinkedQueue<>();

    //定义一个 承装所有worker对象 的容器
    Map<String,Thread> workersMap = new HashMap<>();

    //定义一个 承装每一个worker并发处理的结果集 容器
    ConcurrentHashMap<String,Object> resultQueue = new ConcurrentHashMap<>();

    //创建workers线程数 的构造
    public Master(Worker worker, int workderCount){
        worker.setTaskQueue(taskQueue);
        worker.setResultQueue(resultQueue);
        for (int i = 0; i < workderCount ; i++) {
            this.workersMap.put(Integer.toString(i),new Thread(worker));
        }
    }

    //提交任务方法
    public void conmitTask(Task task){
        taskQueue.add(task);
    }

    //启动所有的worker对象执行任务
    public void execute(){
        for(Map.Entry<String,Thread> map:workersMap.entrySet()){
            //启动worker线程
            map.getValue().start();
        }
    }

    //判断所有的 Worker 是否停止运行
    public boolean isStop(){
        for (Map.Entry<String,Thread> map:workersMap.entrySet()){
            if(map.getValue().getState() != Thread.State.TERMINATED){
                return false;
            }
        }
        return true;
    }

    //计算运行结果
    public int getRequest(){
        int priceResult = 0;
        for(ConcurrentHashMap.Entry<String,Object> map:resultQueue.entrySet()){
            priceResult += (int)map.getValue();
        }
        return priceResult;
    }

}
public class Worker implements Runnable {

    //领取任务的引用
    ConcurrentLinkedQueue<Task> taskQueue;
    //返回处理结果集的引用
    ConcurrentHashMap<String,Object> resultQueue;

    public void setTaskQueue(ConcurrentLinkedQueue<Task> taskQueue) {
        this.taskQueue = taskQueue;
    }

    public void setResultQueue(ConcurrentHashMap<String, Object> resultQueue) {
        this.resultQueue = resultQueue;
    }

    @Override
    public void run() {
        while(true){
            Task task = taskQueue.poll();
            if(task == null)
                break;
            Object result = handle(task);
            this.resultQueue.put(Integer.toString(task.getId()),result);
        }
    }

    private Object handle(Task task) {
        int result = 0;
        try {
            //模拟数据处理业务  05s 每次
            TimeUnit.MILLISECONDS.sleep(500);
            result = task.getPrice();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return result;
    }


}
public class Main {
    public static void main(String[] args) {
        Worker worker = new Worker();
        //创建10个worker去执行任务
        Master  master = new Master(worker,10);
        Random random = new Random();
        //添加任务
        for (int i = 0; i <100; i++) {
            master.conmitTask(new Task(i,"TaskName",random.nextInt(100)));
        }

        //执行任务
        master.execute();
        long start = System.currentTimeMillis();
        //打印结果
        while (true){
            //判断所有线程是否执行完毕
            if (master.isStop()){
                int request = master.getRequest();
                long end = System.currentTimeMillis();
                System.out.println("最终结果为:"+request+",运行时间为:"+(end-start));
                break;
            }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值