С веб-сайта :
Объект Rhino Context используется для хранения специфичной для потока информации о среде выполнения. С каждым потоком, который будет выполнять JavaScript, должен быть один и только один Контекст.
Другими словами, не передавайте контекст между потоками. Просто создайте новый контекст в запущенном потоке. Не беспокойтесь о вызове Context.enter()
более одного раза в потоке. Они являются локальными переменными потока, которые подсчитывают внутренние ссылки. Таким образом, вызов Context.enter()
в той же теме - очень light.
Снова из документов :
Эти вызовы будут работать правильно, даже если уже существует Контекст, связанный с текущим потоком. Этот контекст будет возвращен, а внутренний счетчик увеличен. Только когда счетчик достигнет нуля, он будет отделен от потока.
Лично я везде использовал эту конструкцию кода:
Context ctx = Context.enter();
try {
// do something with the ctx
} finally {
Context.exit();
}
На самом деле, в Groovy я собрал это:
def withContext(Closure closure) {
Context ctx = Context.enter();
try {
closure.call(ctx);
} finally {
Context.exit();
}
}
и затем передайте код, как показано ниже:
withContext { Context ctx ->
ScriptableObject scope = ctx.initStandardObjects()
// now to do work with the scope and ctx.
}
Последнее замечание. Область не привязана к контексту и может быть сохранена / передана между потоками.