如何在java脚本引擎的每次评估中提供单独的上下文?

如何在java脚本引擎的每次评估中提供单独的上下文?,java,javascript,scriptengine,Java,Javascript,Scriptengine,使用javax.script进行基于java的游戏 public class AI implements Runnable { private boolean alive = true; String scriptStr; ScriptEngine scriptEngine; ScriptContext scriptContext; Bindings engineScope; public AI() { ScriptEngineManager scriptEngineManager

使用javax.script进行基于java的游戏

public class AI implements Runnable {
private boolean alive = true;

String scriptStr;
ScriptEngine scriptEngine;
ScriptContext scriptContext;
Bindings engineScope;

public AI() {
    ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
    scriptEngine = scriptEngineManager.getEngineByName("JavaScript");
    scriptContext = new SimpleScriptContext();
    engineScope = scriptContext.getBindings(ScriptContext.ENGINE_SCOPE);
    engineScope.put("scene", Scene.instance);

    try {
        scriptStr = new Scanner(new File(getClass().getResource("ai.js").getPath())).useDelimiter("\\Z").next();
    } catch (FileNotFoundException e) {
        e.printStackTrace(); 
    }
}

@Override
public void run() {
    while (alive) {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        Iterable<IUnit> units = Scene.instance.getUnits();
        for (IUnit unit : units) {
            if (unit.isAlive()) {
                engineScope.put("unit", unit);
                try {
                    scriptEngine.eval(scriptStr, scriptContext);
                } catch (ScriptException e) {
                    e.printStackTrace();  
                }
            }
        }
    }
}
}
公共类AI实现可运行{
private boolean alive=true;
字符串scriptStr;
脚本引擎脚本引擎;
脚本上下文脚本上下文;
绑定engineScope;
公共AI(){
ScriptEngineManager ScriptEngineManager=新ScriptEngineManager();
scriptEngine=scriptEngineManager.getEngineByName(“JavaScript”);
scriptContext=新的SimpleScriptContext();
engineScope=scriptContext.getBindings(scriptContext.ENGINE\u范围);
engineScope.put(“场景”,scene.instance);
试一试{
scriptStr=new Scanner(新文件(getClass().getResource(“ai.js”).getPath()).useDelimiter(\\Z”).next();
}catch(filenotfounde异常){
e、 printStackTrace();
}
}
@凌驾
公开募捐{
(活着时){
试一试{
睡眠(1000);
}捕捉(中断异常e){
e、 printStackTrace();
}
Iterable units=Scene.instance.getUnits();
用于(单位:单位){
if(unit.isAlive()){
引擎视野放置(“单位”,单位);
试一试{
eval(scriptStr,scriptContext);
}捕获(脚本异常){
e、 printStackTrace();
}
}
}
}
}
}
在上面的代码中,我有一个场景,它提供了迭代的单元。我想为所有单元调用相同的js代码(“ai.js”),在这些单元中,单元将决定要做什么

问题是我希望每个单元都有自己的上下文数据。因此,每次我为一个单元评估ai.js时,它们都不会是无状态和无记忆的

正确的方法是什么

我应该为每个单元显式地使用类似SpringContext的东西吗


或者可以像运行单元类上下文中的函数一样运行ai.js吗?

我使用一个脚本引擎完成了这项工作,每个执行都有一个SimpleScriptContext,尽管它可能是每个线程

创建上下文后,必须在该上下文中执行它,然后才能供scriptlet使用

为了优化库的重复包含,我在创建ScriptEngine时将它编译成了一个CompiledScript

我编译每个Scriptlet对象,然后使用eval(上下文)方法执行它们

这在我的测试中足以创建线程安全性