Threads allow programs to perform multiple tasks concurrently. A thread is a single sequence of execution within a program. Multithreading refers to multiple threads running within a single program. Threads share program resources but have their own call stack and local variables. Threads are created by extending the Thread class or implementing the Runnable interface. Synchronization is needed when multiple threads access shared resources concurrently to prevent race conditions. The wait() and notify() methods enable threads to cooperate by pausing and resuming execution.