【发布时间】:2011-09-14 15:29:43
【问题描述】:
我通常使用Observer 模式,但我的同事已经使用线程互通实现了一个观察者(使用wait 和notify/notifyAll)。
我应该使用模式实现我的观察者还是使用等待和通知实现线程间通信?是否有充分的理由避免使用一种方法而始终使用另一种方法?
我总是选择第一个,使用该模式,不符合惯例,因为它看起来更具表现力(涉及的标识符是表达和理解交流内容和方式的好方法)。
编辑:
我在 Swing GUI 中使用该模式,他在 Android 应用程序中使用线程间解决方案。
在他的解决方案中,一个线程生成数据,然后调用notify,以唤醒另一个绘制生成数据的线程,并在每次绘制后调用wait。
他对wait/notify 解决方案的论点是它创建的线程更少,甚至对notify 的多次并发调用也只会导致一个绘制事件,而基于观察者的解决方案会在每次调用时调用一次重绘.他说这只是另一种有效的方法,但并未声称出于性能原因他已经这样做了。
我的论点是我会在 OO 设计级别上表达对象之间的通信,而不是使用使通信几乎不可见的特定于语言的功能。此外,低级线程通信很难掌握,其他读者可能难以理解,而应该在更高级别上实现,即。 e.使用CyclicBarrier。对于一种或另一种解决方案,我没有任何合理的论据,但我想知道对于一种或另一种方法是否有任何合理的论据(即“如果你使用这个,这可能会发生方法,而在另一种方法中是不可能的。”)。
【问题讨论】:
-
有无数种方法可以处理这种模式,但您需要提供更多信息才能准确确定最佳执行策略。具体来说,您要完成的工作是关键。这是一个胖客户端应用程序吗?一个网络应用程序?您是否使用 JMS 等。答案可能会因您的输入而异。
-
我在原始帖子中添加了一些信息(太长了,无法作为评论发布)。
-
使用
setChanged标志可以避免多次调用repaint;这就是它的用途。或者,您的update方法可以在这里提供帮助,方法是查看它们从 Observables 收到的消息。其中任何一个都可能比线程同步更容易调试。 -
听起来他的解决方案可以使用 BlockingQueue 轻松完成,并且完全跳过低级线程的东西。如果您在线程环境中并且只希望一个消费者对多个生产者,这是一种有效的方法。这是观察者/可观察者的特定用例。如果只有一个线程正在生产,一个正在消费并且消费者阻止生产者,我不确定在列出的等待/通知案例中会获得什么。
-
他确实有几个制作人,忘了说。
标签: java