Threads are lightweight subprocesses that can perform tasks concurrently within a process by sharing the process's resources. We use multithreading over multiprocessing because threads share memory, which saves memory, and context switching between threads is faster than between processes. Some advantages of multithreading include not blocking the user, allowing multiple operations to run simultaneously to save time, and failures in one thread not affecting others.