Rhino 和并发访问 javax.script.ScriptEngine

2024-03-25

我通过以下方式使用Rhino 1.6r2javax.scriptAPI。我知道Rhino引擎声称是多线程: http://docs.oracle.com/javase/6/docs/api/javax/script/ScriptEngineFactory.html#getParameter%28java.lang.String%29“引擎实现是内部线程安全的,并且脚本可以同时执行,尽管一个线程上的脚本执行的影响可能对其他线程上的脚本可见。”

我想知道的是,在什么具体条件下,一个脚本执行的效果对另一个脚本可见?在我的代码中,我有时会重复使用ScriptEngine对象,但对于每次执行我都会创建一个新的SimpleBindings并将其传递给eval(String, Bindings)。通过这种安排,内部状态是否可以从一个执行泄漏到另一个执行?如果是这样,怎么办?

这里有一个非常有用的答案 https://stackoverflow.com/a/8585554/365719,但事实并非如此quite告诉我我需要知道什么。


javax.script 包是线程安全的,但如果您的脚本不是线程安全的,则可能会出现并发问题。 脚本内的全局变量对所有线程都是可见的。所以,避免在 JavaScript 函数中使用全局变量

我现在遇到这个问题。我的 JavaScript 如下:

function run(){
    regex = 0;
    regex += 1;
    return regex;
}

我在 ThreadPool(4) 中运行它 10.000 次,并打印结果。

for (int i = 0; i <= 10000; i++){
        executor.submit(new Runnable() {
            @Override
            public void run() {
                try {
                    Double result = (Double) invocable.invokeFunction("run");
                    System.out.println(result);
                } catch (Exception e) {}
            }
        });
    }

这是输出的一部分:

1.0
2.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
2.0
1.0
1.0
0.0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rhino 和并发访问 javax.script.ScriptEngine 的相关文章

随机推荐