gpt4 book ai didi

java - 犀牛嵌入

转载 作者:搜寻专家 更新时间:2023-10-31 08:21:37 24 4
gpt4 key购买 nike

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

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

最佳答案

来自website docs :

The Rhino Context object is used to store thread-specific information about the execution environment. There should be one and only one Context associated with each thread that will be executing JavaScript.

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

再次来自docs :

These calls will work properly even if there is already a Context associated with the current thread. That context will be returned and an internal counter incremented. Only when the counter reaches zero will it be disassociated from the thread.

就我个人而言,我到处都使用这个代码结构:

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

最后一点。作用域与上下文无关,可以在线程之间持久化/传递。

关于java - 犀牛嵌入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2063331/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com