「無限ループ」を持つオブザーバーがある場合、それはもはやオブザーバー パターンではありません。
オブザーバーごとに異なるスレッドを起動できますが、オブザーバーは監視対象オブジェクトの状態を変更することを禁止する必要があります。
最も単純な(そして最も愚かな)方法は、単にあなたの例をスレッド化することです。
void notify() {
for (observer: observers) {
new Thread(){
public static void run() {
observer.update(this);
}
}.start();
}
}
(これは手作業でコーディングされており、テストされておらず、おそらく 1 つまたは 5 つのバグがあります。とにかく、それは悪い考えです)
これに関する問題は、一度に多数の新しいスレッドを割り当てる必要があるため、マシンが分厚くなってしまうことです。
したがって、すべてのスレッドが同時に開始される問題を解決するには、ThreadPoolExecutor を使用します。これは、A) スレッドをリサイクルし、B) 実行中のスレッドの最大数を制限できるためです。
各永久ループはプールからスレッドの 1 つを永久に消費するため、「永遠にループ」の場合、これは決定論的ではありません。
あなたの最善の策は、それらが永遠にループすることを許可しないか、必要に応じて独自のスレッドを作成することです。
変更できないクラスをサポートする必要があるが、どれがすばやく実行され、どれが「永遠に」実行されるかを識別できる場合 (コンピューター用語では、1 秒または 2 秒以上に相当すると思います)、次のようなループを使用できます。これ:
void notify() {
for (observer: observers) {
if(willUpdateQuickly(observer))
observer.update(this);
else
new Thread(){
public static void run() {
observer.update(this);
}
}.start();
}
}
ねえ、実際に「永遠にループする」場合、通知ごとにスレッドを消費しますか? デザインにもう少し時間を費やす必要があるようです。