应用场景
- 现实案例:张三、李四、王五、赵六四个人结伴来到婚介所想要找对象,服务人员让他们将自己的信息填写在登记表上就可以回家了,然后登记人员根据四个人的登记表将信息录入到系统,当系统中存在人员的登记信息之后媒婆就可以替他们找对象了。
- 逻辑拆分:
- 先登记再找对象是一个责任链
- 假设登记和找对象两个步骤每个步骤都是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("将登记表全部交给统计人员之后可以回家了");
}
}
▄█▀█●各位同仁,如果我的代码对你有帮助,请给我一个赞吧,为了下次方便找到,也可关注加收藏呀
如果有什么意见或建议,也可留言区讨论