我需要一些帮助,以了解使用CountDownLatch与传统的wait- notify相比的优势。我认为notifyAll()确实做了同样的事情,并且似乎更易于使用(可能是由于熟悉)。
另外,CountDownLatch中的wait()和await()有什么区别?
谢谢 !
编辑:我想我需要改写我的查询:
Await()根据文档说:
使当前线程 等待, 直到锁存器递减计数到零为止,除非该线程被中断。
对我来说,很难看到wait()和await()之间的区别- await()的确在掩护下使用了wait(),并且当计数达到零时,似乎存在一个隐式notifyAll()。
我要问的是,为什么我不应该简单地使用wait-notifyAll()机制(使用我自己的计数器变量处理),而不是使用CountDownLatch?
他们当然不会做同样的事情:CountDownLatch仅在事件计数达到0时发出信号,并且会自动wait- notify计数,如果您想要实现相同的行为,则需要保留自己的计数。实现相同的行为通常容易出错,最好避免这种情况(尤其是如果您不熟悉并发编程)。比较CountDownLatch和wait- notify很难甚至是拿苹果和橘子相比,它更像是一个比较自动挖掘和内六角扳手。
CountDownLatch
wait- notify
我不知道您是否曾经使用过notifyAll()和CountDownLatch,但notifyAll()除非您一直记下发生了多少事件,否则单独不会给您相同的行为。CountDownLatch最适合执行固定数量的任务并等待这些任务完成,然后再继续执行其余程序。当您有固定数量的线程(例如ThreadPool)执行固定数量的任务时,它特别有用,但是您的线程比任务少,您必须重用它们。使用a,CountDownLatch您可以轻松地等待所有任务完成。我不知道您如何一直使用notifyAll()以实现相同的行为,waitNotify() 更合适)。
notifyAll()
ThreadPool
waitNotify()
对于之间的区别wait()和await(),我有点失望了!查找文档是任何问题的第一步:
wait()
await()
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html
await()是的实函数,CountDownLatch而是wait()从继承的Object。我建议您检查文档中的内容。
Object