从网站文档:
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.
}
最后一点。范围不依赖于上下文,并且可以在线程之间持久化/传递。