Если у вас есть наблюдатель с «бесконечным циклом», он больше не является паттерном наблюдателя.
Вы можете запустить разные потоки для каждого наблюдателя, но наблюдателям ДОЛЖНО быть запрещено изменять состояние наблюдаемого объекта.
Самый простой (и глупый) метод - просто взять ваш пример и сделать его многопоточным.
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();
}
}
Эй, если это на самом деле "Loops forever", будет ли он потреблять поток для каждого уведомления? Это действительно звучит так, как будто вам, возможно, придется потратить немного больше времени на ваш дизайн.