【发布时间】:2015-07-20 07:55:33
【问题描述】:
我的程序使用 Java Scripting API 并且可以同时评估一些脚本。它们不使用共享脚本对象、绑定或上下文,但可以使用相同的 ScriptEngine 和 CompiledScript 对象。我看到 Java 8 中的 Oracle Nashorn 实现不是多线程的,ScriptEngineFactory.getParameter('THREADING') 返回null,文档说:
引擎实现不是线程安全的,不能用于 在多个线程上同时执行脚本。
这是否意味着我应该为每个线程创建一个单独的ScriptEngine 实例?
此外,文档中没有提到 CompiledScript 并发使用,但是:
每个 CompiledScript 都与一个 ScriptEngine 相关联
可以假设CompiledScript线程安全依赖于相关的ScriptEngine,即我应该为每个带有Nashorn的线程使用单独的CompiledScript实例。
如果需要,对于这种(我认为很常见的)情况,使用ThreadLocal、池或其他什么的合适解决方案是什么?
final String script = "...";
final CompiledScript compiled = ((Compilable)scriptEngine).compile(script);
for (int i=0; i<50; i++) {
Thread thread = new Thread () {
public void run() {
try {
scriptEngine.eval(script, new SimpleBindings ()); //is this code thread-safe?
compiled.eval(new SimpleBindings ()); //and this?
}
catch (Exception e) { throw new RuntimeException (e); }
}
};
threads.start();
}
【问题讨论】:
标签: java multithreading nashorn jsr223