Java:notifyObservers不并发?

标签 java design-patterns concurrency observer-pattern java.util.concurrent

我有 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() 返回而不是阻塞。

关于Java:notifyObservers不并发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31923120/

相关文章:

java - MVP设计模式最佳实践

C++ 模板 - 如何跨多个 MTU 使用

go - 并发模式 : worker with variable number of results

concurrency - 我的代码引发了 TASKING_ERROR?

c# - 不同的 HTTP 调用,等待相同的任务

java - 如何将上下文从 AyncTask 传递到 DatabaseHandler

java - 如何在@GET中添加到Web服务迭代元素?

java - 在 Java 中同时获取和放置到 Map

java - null==instance 而不是 instance==null

java - 如何使用 ExecutorService 管理未知数量的 Callables 的返回值?