Inter-thread communication allows threads to pause execution in critical sections and allow other threads to enter those sections. It uses the wait(), notify(), and notifyAll() methods of the Object class. wait() pauses a thread until another calls notify() or notifyAll(), notify() wakes one waiting thread, and notifyAll() wakes all waiting threads. The Runnable interface provides a common protocol for objects to execute code while active. To create a thread using Runnable, a class implements Runnable and defines a run() method, a Thread object is created passing the Runnable, and start() is called to execute run().