Java Virtual Threads, introducidos como característica final en Java 21 bajo el Proyecto Loom, son hilos de ejecución de bajo costo y alta densidad que la Java Virtual Machine (JVM) gestiona directamente, en contraste con los hilos de plataforma (Platform Threads) que son un wrapper directo sobre los hilos del sistema operativo (OS threads). Su característica principal es que son 'montados' (mounted) sobre un número mucho menor de OS threads, conocidos como 'carrier threads'. Esto permite que un solo carrier thread pueda ejecutar miles o incluso millones de Virtual Threads, ya que el estado de un Virtual Thread puede ser suspendido y reanudado por la JVM sin involucrar al sistema operativo, liberando el carrier thread para ejecutar otro Virtual Thread. Son ideales para cargas de trabajo I/O-bound, donde el hilo pasa la mayor parte de su tiempo esperando una operación de entrada/salida.
La implementación de Virtual Threads se integra directamente en la JVM y el JDK. Esto significa que cualquier aplicación Java que utilice la API estándar de concurrencia (como `java.lang.Thread`, `java.util.concurrent.Executors`, `java.util.concurrent.Future`) puede beneficiarse de ellos con cambios mínimos, o incluso sin cambios, simplemente configurando un `ExecutorService` para crear Virtual Threads. Por ejemplo, frameworks web como Spring Boot 3.2+ y servidores de aplicaciones como Tomcat 10.1+ y Jetty 12+ han adoptado Virtual Threads, permitiendo que las aplicaciones escalen significativamente el número de peticiones concurrentes sin los problemas de rendimiento y complejidad asociados a los hilos de plataforma o a la programación reactiva. También son útiles en microservicios, APIs REST, y cualquier servicio que maneje un gran volumen de conexiones concurrentes con operaciones de I/O bloqueantes.
Para un Arquitecto de Sistemas, Virtual Threads representan un cambio de paradigma significativo en la forma de diseñar y escalar aplicaciones Java. Permiten escribir código concurrente de manera síncrona y secuencial, eliminando la complejidad de los callbacks anidados o la programación reactiva para escenarios I/O-bound. Esto mejora la legibilidad, mantenibilidad y depuración del código. La principal ventaja estratégica es la capacidad de escalar la concurrencia a niveles sin precedentes con un uso de recursos (memoria y CPU) mucho más eficiente que los hilos de plataforma tradicionales. Sin embargo, es crucial entender que Virtual Threads no resuelven problemas de CPU-bound; para estos, los hilos de plataforma siguen siendo la opción adecuada. El trade-off principal es la necesidad de una JVM moderna (Java 21+) y la comprensión de que, aunque simplifican la programación concurrente, no eliminan la necesidad de gestionar correctamente el estado compartido y la sincronización, aunque el impacto de la contención de locks se mitiga al no bloquear un OS thread completo.