Кто-либо понимает носорога Контексты JavaScript? Я не могу найти полезную документацию об этом. Моей основной проблемой является Context.exit () (действительно должен быть cx.exit ()), который от то, что я понимаю, выходит из контекста, связанного с текущим потоком? Это означает, что я должен отслеживать какой, который делает поток?
основной поток:
Context cx;
cx.evaluateReader( ... ) // load some function
start thread 2
поток 2:
Object o= scope.get("methodname", scope);
((Function)o).call( ... )
Я не планирую выполнение многопоточности, но что, если различные установки прибывает из различных потоков?
Объект контекста Rhino используется для хранения информации, зависящей от потока, о среде выполнения. Должен быть один и только один контекст, связанный с каждым потоком, который будет выполнять JavaScript.
Другими словами, не передавайте контекст между потоками. Просто создайте новый контекст в запущенном потоке. Не беспокойтесь о вызове Context.enter ()
более одного раза в потоке. Это фактически локальные переменные потока с внутренним подсчетом ссылок. Поэтому вызов Context.enter ()
в том же потоке очень прост.
Снова из документов :
Эти вызовы будут работать правильно, даже если уже существует Контекст, связанный с текущим потоком. Этот контекст будет возвращен, и внутренний счетчик будет увеличен. Только когда счетчик достигнет нуля, он будет отключен от потока.
Лично я просто везде использовал эту конструкцию кода:
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.
}
Одно последнее замечание. Область не привязана к контексту и может сохраняться / передаваться между потоками.