Browse Clojure Foundations for Java Developers

The Need for Asynchronous Programming

Use async when waiting dominates: I/O, fan-out calls, pipelines, and event-driven work.

Asynchronous programming is about not wasting threads while you wait—usually on I/O. Instead of tying up one thread per request, you structure work so that “waiting time” becomes a chance to do other useful work.

In Clojure, async often shows up as a small set of tools: futures/promises for simple off-thread tasks, channels for structured pipelines, and message/event-driven designs for reactive systems.

Java mental model: async is what you reach for when a thread pool stops scaling because most tasks are blocked, not because CPU is maxed out.

In this section

Revised on Friday, April 24, 2026