如果你有一个带有“无限循环”的观察者,它就不再是真正的观察者模式了。
您可以为每个观察者触发不同的线程,但必须禁止观察者更改被观察对象的状态。
最简单(也是最愚蠢)的方法就是以您的示例并使其线程化。
void notify() {
for (observer: observers) {
new Thread(){
public static void run() {
observer.update(this);
}
}.start();
}
}
(这是手工编码的,未经测试,可能有一个或五个错误——无论如何这都是个坏主意)
这样做的问题是它会使你的机器变得笨重,因为它必须一次分配一堆新线程。
因此,要解决所有线程同时启动的问题,请使用 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();
}
}
嘿,如果它真的“永远循环”,它会为每个通知消耗一个线程吗?听起来您可能需要在设计上花费更多时间。