встраивание носорога

Кто-либо понимает носорога Контексты 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( ... )

Я не планирую выполнение многопоточности, но что, если различные установки прибывает из различных потоков?

5
задан Brian Tompsett - 汤莱恩 2 June 2015 в 19:59
поделиться

1 ответ

Из документации веб-сайта :

Объект контекста 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.
}

Одно последнее замечание. Область не привязана к контексту и может сохраняться / передаваться между потоками.

13
ответ дан 18 December 2019 в 14:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: