Virtual Threads: El futuro de la concurrencia en Java - dlleon2/Taller_vThread GitHub Wiki

Virtual Threads en Java

Introducción a los Virtual Threads

Los Virtual Threads son una característica introducida en Java para permitir la creación de un gran numero de hilos ligeros, gestionados por Java Virtual Machine (JVM)de manera eficiente. A diferencia de los hilos tradicionales, los virtual threads están desacoplados de los hilos del sistema operativo, lo que reduce el consumo de memoria y mejora la escalabilidad en aplicaciones con muchas tareas concurrentes.

Carrier Threads vs Virtual Threads

Carrier Threads:

Hilos del sistema operativo donde la JVM ejecuta código Java. Son relativamente pesados en términos de memoria y coste de creación/destrucción.

Virtual Threads:

Construidos dentro de la JVM, pueden asociarse dinámicamente a carrier threads sólo cuando ejecutan código Java. Cuando un virtual thread se bloquea en una operación de I/O, la carrier thread se libera para atender otros virtual threads. Controlado por el sistema operativo.

El mapeo es dinámico: un pool de carrier threads sirve muchas veces a un gran número de virtual threads asíncronamente.

Bloqueo y Escalabilidad

  • Bloqueo:

Si un virtual thread realiza una llamada bloqueante, la JVM detecta el bloqueo y lo desvincula de su carrier thread. Este carrier thread queda libre para ejecutar otro virtual thread.

  • Escalabilidad:

Gracias a este mecanismo, podemos crear decenas o cientos de miles de virtual threads sin el gran coste de recursos asociado a platform threads.

Creación y gestión de Virtual Threads

  • Con Thread Thread vt = Thread.startVirtualThread(() -> tarea()); vt.join();
  • startVirtualThread inicia inmediatamente un hilo ligero.
  • join() espera a que termine la tarea.
  • Con ExecutorService try (var exec = Executors.newVirtualThreadPerTaskExecutor()) { exec.submit(() -> tarea()); }
  • Crea automáticamente un hilo virtual por tarea.
  • Al cerrar el esxcutor, espera a que todas las tareas acaben.

Structured Concurrency Breve mención

El concepto de structured concurrency organiza las tareas concurrentes en jerarquías, análogas a bloques try-with-resources. Un scope de concurrencia garantiza:

Espera automática de subtareas.

Cancelación conjunta.

Loom introduce clases como StructuredTaskScope, que simplifican la gestión coordinada de múltiples virtual threads.

Ventajas y Desventajas

  • Ventajas:

APIs más simples frente a callbacks/asíncrono.

Gran escalabilidad para I/O intensivo.

Mejor legibilidad y mantenimiento.

  • Desventajas:

Debugging y profiling pueden requerir herramientas actualizadas.

No mejora operaciones CPU-intensivas.

Incremento de complejidad en la JVM y GC.

Escenarios ideales de uso

Microservicios con llamadas HTTP/DB intensivas.

Servidores de alta concurrencia (chat, juegos en tiempo real).

Procesamiento de flujos de datos.

Pruebas de carga y simulaciones.

Otras Implementaciones en otros lenguajes.

  • Go: goroutines y scheduler M:N.
  • Kotlin: coroutines basadas en continuations.
  • .NET: async/await con task scheduler.
  • Python: asyncio y librerías como Trio.

Opinión Personal

Virtual threads promete cambiar la forma de escribir concurrencia en java, ya que combinaran claridad y eficiencia , facilitando la escritura de códigos concurrente. Pronto, se convertirán en la opción preferida para la mayoría de aplicaciones Java que requieran alta concurrencia, reemplazando gradualmente enfoques basados en callbacks o frameworks de actores.

⚠️ **GitHub.com Fallback** ⚠️