Cómo Jactl implementa continuaciones en Java 8 y se integra con hilos virtuales

Fuentes: Jactl Continuations and Virtual Threads in Java 8

Jactl es un lenguaje de scripting integrable y seguro para aplicaciones Java, pensado para ejecutarse dentro de arquitecturas reactivas basadas en un pool de hilos event-loop. Uno de sus requisitos de diseño era no bloquear el hilo de ejecución cuando una operación de larga duración —como una consulta a base de datos o una llamada RPC— entra en espera. En Java 21 esta necesidad la resuelven los hilos virtuales, que preservan la pila de llamadas y la reanudan al completarse la operación; Jactl puede desactivarse en ese escenario mediante la bandera JactlContext.async(false). Sin embargo, Jactl debía funcionar también en Java 8 y 11, donde no existe esa primitiva. Para resolverlo, su autor recurrió a un mecanismo de continuaciones basado en excepciones controladas. Cuando una función asíncrona como sleep() inicia una operación bloqueante, lanza un objeto Continuation; el código generado por el compilador captura la excepción en cada frame Jactl de la pila, guarda las variables locales y la posición de ejecución, y relanza una nueva Continuation encadenada. El resultado es una cadena de objetos que reconstruye el estado completo del script sin mantener la pila JVM original, lo que libera el hilo event-loop. El compilador identifica recursivamente qué funciones pueden lanzar Continuation —las llamadas async— y propaga esa marca a todos los llamadores, envolviendo cada invocación en un bloque try/catch que guarda un MethodHandle, la ubicación lógica y los valores locales en arrays long[] y Object[]. Al reanudarse, la función recibe como primer argumento la Continuation original y salta al punto exacto donde se suspendió. El artículo describe con pseudocódigo cómo queda el código generado y por qué el coste de lanzar excepciones sin stack trace es asumible.