0

我有两种类型的顺序数据流。并且,每种类型的数据都有一个订阅(监听)的观察者。

Observer observer1 = new Observer() {
    @Override
    public void next(Data data) {
    //Do something
    }

}


Observer observer2 = new Observer() {
    @Override
    public void next(Data data) {
    //Do something
    }

}

feed.subscribe(observer1, "Type1");
feed.subscribe(observer2, "Type2");

Type1当接收到的一条数据时 ,会调用的next()方法和 也是一样的。observer1Type2observer2

而且由于数据是顺序的,当我们有 and 的数据时type1type2第二个应该等待第一个的进程(将被阻塞)。

现在我想用多线程来解决这个问题。但是,我不想为收到的每条数据创建一个线程。我希望观察者并行运行。

例如,如果我有这个序列:

type1, type1, type1, type2, ...

第二个和第三个数据应该等待第一个处理(因为它们是type1),但第四个应该被收集observer2和处理。

请注意,我使用的 API 只允许我订阅,它会处理这些next()方法。

我想到的解决方案是在线程和观察者上进行映射。因此,在每次调用方法时,我可以调用分配给该类型的线程来恢复next(),而不是创建一个新的。Thread或者,如果有一个线程运行observer1,我希望所有数据都type1留在队列中等待该线程处理它们。

在Java中解决这个问题的任何设计模式或数据结构?

4

2 回答 2

2

这听起来很适合生产者/消费者模式。会有两个消费者,每个数据类型一个。还有一个生产者线程,它是数据馈送的订阅者。对于接收到的每个数据元素,它会将一个工作单元放在队列中以供适当的消费者使用。上面的 Wikipedia 文章有一个示例 Java 实现。许多其他资源也可以在网络上获得。

于 2013-10-09T15:06:24.833 回答
1

这是通过队列解决的典型问题。有一个消费者线程、两个队列(通常是 N 个队列,其中 N 是您的数据类型)和 2 个(通常也是 N 个)工作线程。消费者线程读取流并将“消息”放入正确的队列中。每个工作线程轮询其对应的队列,处理下一个可用项目并重复。

参考:查看java.util.Queuefor Java >= 1.5 的实现。

于 2013-10-09T15:02:51.973 回答