Java allows multithreading which means multiple tasks can run concurrently within a single program. Threads go through different life cycle stages from new to runnable to waiting and terminated. Each thread is assigned a priority level but priorities do not guarantee order of execution. New threads can be created by implementing Runnable interface and starting the thread. Synchronization is needed when multiple threads access shared resources to prevent race conditions and ensure only one thread accesses the resource at a time.