异步责任链实现demo(zookeeper源码有应用这种思想)--精解demo版

应用场景

  • 现实案例:张三、李四、王五、赵六四个人结伴来到婚介所想要找对象,服务人员让他们将自己的信息填写在登记表上就可以回家了,然后登记人员根据四个人的登记表将信息录入到系统,当系统中存在人员的登记信息之后媒婆就可以替他们找对象了。
  • 逻辑拆分:
    • 先登记再找对象是一个责任链
    • 假设登记和找对象两个步骤每个步骤都是1s时间,并且该婚介所只有一个登记人员和一个媒婆
    • 四个人填完登记表之后就可以回家了,不能有人一直等着
    • 不使用消息中间件【MQ】

实现思路

  • 定义两个类分别启动一个线程实现登记和找对象的功能
  • 在这两个类中定义成员变量–阻塞队列,用于存放当前未处理的任务(登记或者找对象)
  • 每一层任务处理都在run()方法中(真正的实现登记和找对象的功能),对外提供添加任务的共有方法(向阻塞队列中添加任务)

实现代码

责任链接口

public interface FindObjectProcessor {
    //执行任务
    void processor(Person person);
}

需要找对象的人

public class Person {
    private String name;
}

登记业务处理类(登记人员)【继承Thread,实现责任链接口】

public class Register extends Thread implements FindObjectProcessor{

	//存放当前未处理的任务
    LinkedBlockingQueue<Person> persons = new LinkedBlockingQueue<>();
    
	//记录下一步要做的工作【此处未找对象】
    private final FindObjectProcessor nextFindObjectProcessor;
    
	//传入下一步要做的工作
    public Register(FindObjectProcessor nextFindObjectProcessor) {
        this.nextFindObjectProcessor = nextFindObjectProcessor;
    }
	
	//外界通过此方法传入当前要处理的任务
    @Override
    public void processor(Person person) {
    	//此处只对任务进行保存,并不进行处理
        persons.add(person);
    }

	//异步处理任务【登记】
    @Override
    public void run() {
        while (!Thread.currentThread().isInterrupted()){
            try {
                Person take = persons.take();//获取任务
                System.out.println("【登记人员】录入信息Register:"+take.getName());
                TimeUnit.SECONDS.sleep(1);//登记耗时1s
                //将登记完的人员传递给媒婆
                nextFindObjectProcessor.processor(take);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

找对象处理类(媒婆)【继承Thread,实现责任链接口】

public class Find extends Thread implements FindObjectProcessor{
	
	//存放当前未处理的任务
    LinkedBlockingQueue<Person> persons = new LinkedBlockingQueue<>();

	//外界通过此方法传入当前要处理的任务
    @Override
    public void processor(Person person) {
        persons.add(person);
    }

	//异步处理任务【找对象】
    @Override
    public void run() {
        while (!Thread.currentThread().isInterrupted()){
            try {
                Person take = persons.take();//获取任务
                System.out.println("【媒婆】帮忙找对象Find:"+take.getName());
                TimeUnit.SECONDS.sleep(1);//找对象耗时1s
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

测试类【接待要找对象人员的服务人员】

public class TestDemo {
	
	//保存登记人员的信息【服务人员将登记表交给登记人员】
    Register register;
	
	//初始化责任链【相当于整个婚介所的核心业务流程】
    protected TestDemo(){
        Find find = new Find();
        find.start();
        register = new Register(find);
        register.start();
    }

	//将登记表交给服务人员
    private void findObject(Person person){
        register.processor(person);
    }

    public static void main(String[] args) {
        System.out.println("需要找对象的人开始写登记表");
        Person zhangsan = new Person().setName("张三");//将实体类中的set方法返回值改为当前对象类型,然后return this;就可以实现链式调用
        Person lisi = new Person().setName("李四");
        Person wangwu = new Person().setName("王五");
        Person zhaoliu = new Person().setName("赵六");
        System.out.println("登记表写完");
        
        TestDemo meipo = new TestDemo();
        
        meipo.findObject(zhangsan);
        meipo.findObject(lisi);
        meipo.findObject(wangwu);
        meipo.findObject(zhaoliu);
        System.out.println("将登记表全部交给统计人员之后可以回家了");

    }
}

▄█▀█●各位同仁,如果我的代码对你有帮助,请给我一个赞吧,为了下次方便找到,也可关注加收藏呀
如果有什么意见或建议,也可留言区讨论

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值