犀牛嵌入

时间:2010-01-14 10:06:58

标签: java rhino embedding

任何人都了解犀牛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 个答案:

答案 0 :(得分:13)

来自website docs

  

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

换句话说,不要在线程之间传递上下文。只需在正在运行的线程中创建一个新的上下文不要担心在一个帖子中多次调用Context.enter()。它们是有效的线程局部变量,内部引用计数。因此,在同一个帖子中调用Context.enter() 非常亮。

再次来自docs

  

即使已经有与当前线程关联的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.
}

最后一点说明。范围与上下文无关,可以在线程之间保持/传递。