More than one thread can wait on an object at any given time. When you call an object's notify() method, only one of those waiting threads will be woken (and you can't choose which one). On the other hand, if you call an object's notifyAll() method, all of those waiting threads will be woken.
I’ve looked at a lot of different solutions, and in my humble opinion Aspose is the way to go. Here’s the link: http://aspose.com