我需要一些帮助来理解使用CountDownLatch优于传统的wait-notify的优势。我认为notifyAll()确实做了同样的事情,它似乎更容易使用(也许是因为熟悉)。
此外,来自CountDownLatch的wait()和await()有什么区别?
谢谢!
编辑:我想我需要重新解释一下我的问题:Await()根据文档说:
导致当前线程等待,直到锁存器倒计数到零,除非线程被中断。
对我来说很难看出wait()和await()之间的区别 - await()确实在封面下使用了wait(),而且当count到零时似乎有一个隐含的notifyAll()。
我想要问的是,为什么我不应该只使用wait-notifyAll()机制(使用我自己的计数器变量处理),而不是使用CountDownLatch?
答案 0 :(得分:9)
他们当然不会做同样的事情:CountDownLatch
仅在事件计数达到0时自动发出信号并自动执行,wait-notify
要求您保留自己的计数,如果您想实现相同的行为。实现相同的行为通常容易出错,最好避免它(特别是如果您不熟悉并发编程)。比较CountDownLatch
和wait-notify
几乎不是苹果与橙子的比较,它更像是比较自动钻和艾伦扳手。
我不知道您是否使用过notifyAll()
和CountDownLatch
,但notifyAll()
单独行动不会给您相同的行为,除非您一直计算有多少事件发生了。在您恢复执行其余程序之前,CountDownLatch
可能最适合执行固定数量的任务并等待完成这些任务。当你有一定数量的线程(例如ThreadPool
)执行固定数量的任务时,它会特别有用,但是你的线程比任务少,你必须重用它们。使用CountDownLatch
,您可以轻松等待所有任务完成。我不知道你是如何使用notifyAll()
来实现相同的行为的,但是如果你向我们提供更多信息,我们可以解决两者中哪一个是更好的选择(当然有些情况下{ {1}}更合适。)
关于waitNotify()
和wait()
之间的区别,我对你有些失望!查阅文档是任何问题的第一步:
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html
await()
是await()
的实际函数,而CountDownLatch
是wait()
的继承。我建议您查看文档以了解它们的用途。