Java:notifyObservers不兼容?

Man*_*odi 0 java concurrency design-patterns java.util.concurrent observer-pattern

我有4个观察者正在监听可观察的数据.然而,我的一个观察者是较慢的,可以采取.我刚看到notifyObserver的代码为: -

  132       public void notifyObservers(Object arg) {
  133           /*
  134            * a temporary array buffer, used as a snapshot of the state of
  135            * current Observers.
  136            */
  137           Object[] arrLocal;
  138   
  139           synchronized (this) {
/**comment removed for clarity **/

  152               if (!changed)
  153                   return;
  154               arrLocal = obs.toArray();
  155               clearChanged();
  156           }
  157   
  158           for (int i = arrLocal.length-1; i>=0; i--)
  159               ((Observer)arrLocal[i]).update(this, arg);
  160       }
Run Code Online (Sandbox Code Playgroud)

从代码中可以清楚地看到观察者是一个接一个地被调用的.由于设计观察者在执行中是独立的.不应该同时调用它们arg作为最终的功能吗?

执行的时间本t1+t2+t3+t4应该是max(t1,t2,t3,t4).我可以使update观察者的功能非阻塞,但是这可能会导致一些竞争条件,因为notifyObservers()在没有完全执行观察者的情况下退出.

我错过了这个设计背后的东西吗?这是故意的,我无法在这里减少时间吗?

Sam*_*uel 7

优化通知观察者的执行时间并不是模式的一部分.具有长时间运行任务的观察者应该启动自己的执行线程并立即返回update()而不是阻塞.