【问题标题】:rhino embedding犀牛嵌入
【发布时间】:2010-01-14 10:06:57
【问题描述】:

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

我不打算做多线程,但是如果不同的设置来自不同的线程呢?

【问题讨论】:

    标签: java rhino embedding


    【解决方案1】:

    来自website docs

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

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

    再次来自docs

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多