Моя программа использует Java Scripting API и может анализировать некоторые скрипты одновременно. Они не используют общие объекты script, привязки или контекст, но могут использовать те же объекты ScriptEngine
и CompiledScript
. Я вижу, что реализация Oracle Nashorn в Java 8 не является многопоточной, ScriptEngineFactory.getParameter('THREADING')
возвращает null
, о которой говорится в документации:
Реализация ядра не является потокобезопасной и не может использоваться для выполнять скрипты одновременно на нескольких потоках.
Означает ли это, что я должен создать отдельный экземпляр ScriptEngine
для каждого потока?
Кроме того, документация ничего не говорит о параллельном использовании CompiledScript
, но:
Каждый CompiledScript связан с ScriptEngine
Можно предположить, что CompiledScript
безопасность потоков зависит от связанного ScriptEngine
, т.е. я должен использовать отдельный экземпляр CompiledScript
для каждого потока с помощью Nashorn.
Если мне нужно, какое подходящее решение для этого (я думаю, очень распространенный) случай, используя 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();
}