我有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       }


从代码中可以清楚地看到观察者是一个接一个的。由于设计的原因,观察者在执行中是独立的。函数不应该同时调用它们并使arg成为最终函数吗?

当前执行时间为t1+t2+t3+t4,应为max(t1,t2,t3,t4)。我可以使观察者的update函数成为非阻塞函数,但那是不一样的,并且可能会导致某些竞争条件,因为notifyObservers()将在没有完全执行观察者的情况下退出。

我在该设计背后缺少什么吗?这是故意的,我没有办法减少在这里的时间吗?

最佳答案

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

09-04 08:02
查看更多