A Brief History
Java had concurrency support from the begining.
Java 1(1996) includes the Thread class, the Runnable interface and
the synchronized keyword. These features laid the foundation for
multithreading in Java.
Java 5(2004) introduced the java.util.concurrency package with a
comprehensive set of tools for concurrent programming including Future
and Callable, Executors, Locks, Semaphore, Atomic Classes, Concurrent
Collections, and BlockingQueue, making it easier to work with
multithreading and reducing the complexity associated with manually
managing threads.
Java 8(2014): Streams, CompletableFuture. CompletableFuture is currently the primary mechanism for concurrent programming in modern Java.
Java 9(2015): Reactive Stream
Java 21(2023): Virtual Threads (Actually Java had green threads at the begining, but switched to platform threads in version 1.2 in order to take full advantage of multi-core processors.)