Multithreading allows programs to split into multiple threads to perform tasks concurrently. There are two main ways to create threads: extending the Thread class or implementing the Runnable interface. Threads transition between different states like New, Runnable, Running, Waiting and Dead. Synchronization is needed to control access to shared resources between threads using locks and synchronized methods/blocks. The thread scheduler determines which threads get CPU time based on their priority and state.