Desde el website docs:
el objeto de contexto Rhino se utiliza para almacenar información de rosca específica sobre el entorno de ejecución. Debe haber un único contexto asociado a cada subproceso que ejecutará JavaScript.
En otras palabras, no pase el contexto entre los hilos. Solo crea un nuevo contexto en el hilo en ejecución. No se preocupe por llamar al Context.enter()
más de una vez dentro de un hilo. Son efectivamente variables locales locales que son contadas internamente por referencia. Entonces, llamar a Context.enter()
en el mismo hilo es muy light.
Una vez más desde el docs:
Estas llamadas funcionará correctamente incluso si ya existe un contexto asociado al subproceso actual. Ese contexto será devuelto y un contador interno incrementado. Solo cuando el contador llegue a cero se desasociará del hilo.
Personalmente, acabo de utilizar este código de construcción en todas partes:
Context ctx = Context.enter();
try {
// do something with the ctx
} finally {
Context.exit();
}
De hecho, en el maravilloso Azoté juntos esto:
def withContext(Closure closure) {
Context ctx = Context.enter();
try {
closure.call(ctx);
} finally {
Context.exit();
}
}
y luego pasarlo código como el siguiente:
withContext { Context ctx ->
ScriptableObject scope = ctx.initStandardObjects()
// now to do work with the scope and ctx.
}
Una última nota. El alcance no está vinculado al contexto, y puede persistir/pasarse entre hilos.