вложение носорога - PullRequest
       19

вложение носорога

5 голосов
/ 14 января 2010

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

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

1 Ответ

13 голосов
/ 26 марта 2010

С веб-сайта :

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...