Rhino嵌入式

5

有人了解犀牛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个回答

14

来自官方文档

Rhino Context对象用于存储关于执行环境的线程特定信息。每个将执行JavaScript的线程应该关联有且仅有一个Context。

换句话说,不要在线程之间传递context。在运行线程中创建一个新的context即可,不必担心在一个线程中多次调用Context.enter()。这些实际上是线程本地变量,并且内部有引用计数,因此在同一线程中调用Context.enter()非常轻巧。

再次从文档中得知:

即使当前线程已经与Context相关联,这些调用也会正常工作。该context将被返回并增加内部计数器。只有当计数器达到零时,它才会与线程解除关联。

就我个人而言,我无论何时都使用以下代码构造:

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.
}

最后一点,范围不与上下文绑定,可以在线程之间保持/传递。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接