Threads são usadas para executar processos simultaneamente. A classe Thread e interface Runnable permitem manipular threads. Synchronized garante acesso exclusivo a recursos compartilhados para evitar race conditions, mas reduz performance. Variáveis atômicas permitem alterar recursos compartilhados sem filas ou conflitos. Semaphores limitam o número de threads que podem acessar um recurso de cada vez. Race conditions e deadlocks são problemas com concorrência.