如果你有一个“无限循环”的观察员,它不再是真正的观察者模式。
你可以发射不同的线程每个观察者,但观察者必须从观察对象上改变国家被禁止。
最简单的(和愚蠢的)方法,简直是把你的榜样,使之穿过。
void notify() {
for (observer: observers) {
new Thread(){
public static void run() {
observer.update(this);
}
}.start();
}
}
(这是由手工编码,是未经检验的,可能有一个bug,五 - 这是一个坏主意,反正)
这里的问题是,它会让你的机器笨重的,因为它必须一次分配一堆新线程。
所以修复起步价一旦所有的踏板问题,使用ThreadPoolExecutor的,因为它将A)回收线程,B)可以限制运行的线程的最大数量。
这是不是在你的情况下,“死循环”的确定性,因为每个永远循环将永久吃从池中一个线程。
最好的办法是不要让他们永远循环下去,或者,如果有必要,让他们创建自己的线程。
如果你不得不支持那些不能改变的类,但你可以确定哪些将会很快运行,哪些运行“永远”(用计算机术语来说,我认为这相当于超过一秒或两秒),那么你可能会使用这样一个循环:
void notify() {
for (observer: observers) {
if(willUpdateQuickly(observer))
observer.update(this);
else
new Thread(){
public static void run() {
observer.update(this);
}
}.start();
}
}
嘿,如果它实际上“永远循环”,它会消耗一个线程为每个通知?这听起来好像你可能需要花更多的时间在你的设计上。
+1为解决问题而不是症状。否则,你会越来越疯狂的附加修补程序,使维护变得不可能。 – reccles 2009-12-07 21:20:06
我同意。我只是想看看是否有办法解决这个问题。谢谢。 – suprasad 2009-12-08 01:07:00