如果你有一個「無限循環」的觀察員,它不再是真正的觀察者模式。
你可以發射不同的線程每個觀察者,但觀察者必須從觀察對象上改變國家被禁止。
最簡單的(和愚蠢的)方法,簡直是把你的榜樣,使之穿過。
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