【发布时间】:2013-10-09 14:57:50
【问题描述】:
我有两种类型的顺序数据流。 而且,每种类型的数据都有一个订阅(监听)的观察者。
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的一条数据时,会调用observer1的next()方法,Type2和observer2也是一样。
由于数据是顺序的,当我们有type1和type2的数据时,第二个应该等待第一个的进程(将被阻塞)。
现在我想用多线程来解决这个问题。但是,我不想为收到的每条数据创建一个线程。我希望观察者并行运行。
例如,如果我有这个序列:
type1, type1, type1, type2, ...
第二个和第三个数据应该等待第一个处理(因为它们是type1),但第四个应该由observer2收集并处理。
请注意,我使用的 API 只允许我订阅,它将处理 next() 方法。
我想到的解决方案是对线程和观察者进行映射。因此,在每次调用next() 方法时,我可以调用分配给该类型的线程来恢复,而不是创建新的Thread。或者,如果有一个线程为observer1 运行,我希望type1 的所有数据都留在队列中等待该线程处理它们。
在Java中解决这个问题的任何设计模式或数据结构?
【问题讨论】:
-
当然你应该使用
Executors.newCachedThreadPool()而不是分叉你自己的线程,但这并不能说明排序是如何发生的。 -
两者
Observers期望相同的Type即Data。 -
@JarrodRoberson,是的,API 将根据我订阅的类型选择正确的观察者。
-
致downvoter(s):原因是哪一个:没有研究工作、没有用或不清楚。请告知更多问题。谢谢。
-
@Afshin Moazami 没关系,你的问题是合理的。在没有解释的情况下投反对票确实是不礼貌的表现。
标签: java multithreading observer-pattern producer-consumer