5

有人了解 rhino 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( ... )

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

4

1 回答 1

14

网站文档

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

换句话说,不要在线程之间传递上下文。只需在正在运行的线程中创建一个新的上下文。不要担心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.
}

最后一点。范围不依赖于上下文,并且可以在线程之间持久化/传递。

于 2010-03-25T21:48:46.530 回答