Master-Worker Design Pattern

本文介绍了一个基于 Master-Worker 模型的分布式任务调度系统。Master 负责任务的提交、结果聚合,Worker 执行任务。系统使用并发集合和队列确保线程安全,通过 Function 接口处理结果。主要涉及并发编程、任务调度和分布式计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

目录

 

Master

Task

Result

Worker


Master

import cn.hutool.core.collection.ConcurrentHashSet;
import com.example.redis.masterworker.task.SumTask;
import lombok.extern.slf4j.Slf4j;
import java.util.HashMap;
import java.util.Set;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.function.Function;

@Slf4j
public class Master{
    private final ConcurrentHashSet<Result> results = new ConcurrentHashSet<>();

    private  final ConcurrentLinkedQueue<Task> tasks = new ConcurrentLinkedQueue<>();

    private  final HashMap<String, Worker> workers = new HashMap<>();

    private final int threads;

    private int taskCount;

    private Function<Set<Result>, Result> resultFunction;



    public Master(int threads) {
        this.threads=threads;
        for (int i = 0; i < threads; i++) {
            Worker worker = new Worker();
            worker.setName(""+i);
            workers.put("worker-" + i, worker);
        }
    }

    public void submitTasks(Task task, int count,Function<Set<Result>, Result> resultFunction) {
        this.taskCount = count;
        this.resultFunction = resultFunction;
        for (int i = 0; i < count; i++) {
            tasks.add(task);
        }
    }

    public void cleanTasks() {
        tasks.clear();
    }

    // TODO: 2022/8/21 线程安全问题
    public void handleTasksByLoop() {
        while (!tasks.isEmpty()) {
            Result result = tasks.poll().execute();
            setResult(result);
        }
    }

    public void setResult(Result result) {
        results.add(result);
    }

    public void invoke() {
        workers.values().forEach(worker -> {
            worker.setMaster(this);
            worker.start();
        });
    }

    public Result getAggregationResult() {
        while ((long) tasks.size() > 0) {
            try {
                Thread.sleep(1000);
                System.out.println("等待获取结果");
                System.out.println("剩余任务数:"+ (long) tasks.size());
            } catch (InterruptedException e) {
                log.error("getAggregationResult error",e);
            }
        }
        return resultFunction.apply(results);
    }


    public static void main(String[] args) {
        Master master = new Master(25);

        master.submitTasks(new SumTask(), 10000, new Function<Set<Result>, Result>() {
            @Override
            public Result apply(Set<Result> results) {
                for (Result result : results) {
                    Object value = result.getValue();
                    System.out.println("最终结果"+value.toString());
                }
                return null;
            }
        });
        master.invoke();

    }
}

Task

public interface Task {
    Result execute();
}

Result

public class Result {
    public Object value;

    public Object getValue() {
        return value;
    }

    public void setValue(Object value) {
        this.value = value;
    }

    public Result(Object value) {
        this.value = value;
    }
}

Worker

public class Worker extends Thread {
    private Master master;

    public void setMaster(Master master) {
        this.master=master;
    }

    @Override
    public void run() {
        master.handleTasksByLoop();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值