Async programming allows non-blocking execution by invoking logic asynchronously when resources become available. This avoids blocking threads and improves server performance. Modern frameworks support async programming with futures/promises and actors. Futures allow composing asynchronous operations through transformations like mapping. Actors encapsulate state and process messages asynchronously without blocking threads. The example shows implementing an async controller in Play Framework that uses a future to call an external API and an actor to generate random numbers.