When programming with most other languages, you must depend on the O.S. to establish communication between threads. This, of course, adds overhead.
By contrast, Java provides a clean, low-cost way for two or more threads to talk to each other, via calls to predefined methods that all objects have.
Java’s messaging system allows a thread to enter a synchronized method on an object, and then wait there until some other thread explicitly notifies it to come out of wait state.