犀牛嵌入

neh*_*heh 5 java rhino embedding

任何人都了解犀牛javascript上下文?我找不到任何有用的文档.我的主要问题是Context.exit()(真的应该是cx.exit())根据我的理解退出与当前线程相关的上下文?这是否意味着我需要跟踪哪个线程的作用?

主线程:

Context cx;
cx.evaluateReader( ... ) // load some function
start thread 2
Run Code Online (Sandbox Code Playgroud)

线程2:

Object o= scope.get("methodname", scope);
((Function)o).call( ... )
Run Code Online (Sandbox Code Playgroud)

我不打算做多线程但是如果不同的设置来自不同的线程怎么办?

Joh*_*ree 13

来自网站文档:

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

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

再次来自文档:

即使已经存在与当前线程关联的Context,这些调用也将正常工作.将返回该上下文并且内部计数器递增.只有当计数器达到零时才会从线程中解除关联.

就个人而言,我只是在任何地方使用此代码构造:

Context ctx = Context.enter();
try {
    // do something with the ctx
} finally {
    Context.exit();
}
Run Code Online (Sandbox Code Playgroud)

事实上,在Groovy中我鞭打了这个:

def withContext(Closure closure) {
    Context ctx = Context.enter();
    try {
        closure.call(ctx);
    } finally {
        Context.exit();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后传递代码如下:

withContext { Context ctx ->
    ScriptableObject scope = ctx.initStandardObjects()
    // now to do work with the scope and ctx.
}
Run Code Online (Sandbox Code Playgroud)

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