下面我分享了我的代码,我试图使用线程安全的Nashorn作为脚本引擎来评估简单的数学公式。公式将类似于“a*b/2”,其中a
public class EvaluateFormulas {
@Autowired
NashornThreadPool pool;
private ScriptEngineManager factory;
private ScriptEngine engine;
private ScriptContext context;
@PostConstruct
public void setup() {
factory = new ScriptEngineManager();
engine = factory.getEngineByName("nashorn");
context = engine.getContext();
}
public void evaluate() {
pool.getThreadPoolExecutor().submit(new Runnable() {
@Override
public void run() {
Double result;
Bindings bind = engine.createBindings();
bind.putAll(map);
context.setBindings(bind, ScriptContext.GLOBAL_SCOPE);
try {
result = (Double) engine.eval(formula);
} catch (ScriptException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
}
我需要知道这种方法是否有助于使Nashorn线程在这个用例中安全。我在Attila的回答中读到,我们可以在线程之间共享脚本引擎对象,因为它们是线程安全的。
对于bindings和eval,因为我们正在为每次执行evaluate创建新线程,每个线程都有自己的bindings对象引用。因此,总体而言,这个实现是线程安全的吗?
我不认为这是线程安全的,因为您正在更改绑定,而另一个线程可能正在执行代码。您实际上不需要这样做;您可以创建一个全新的上下文,然后在该上下文中评估脚本。我会这样做:
public void evaluate() {
pool.getThreadPoolExecutor().submit(new Runnable() {
@Override
public void run() {
Double result;
ScriptContext myContext = new SimpleScriptContext();
Bindings bindings = engine.createBindings();
bindings.putAll(map);
myContext.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
try {
result = (Double) engine.eval(formula, myContext);
} catch (ScriptException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
现在每个脚本都在自己的上下文中进行评估。
我最近一直在和这部剧合作!框架和Nashorn,试图呈现Redux应用程序。最初,我在ThreadPoolExecutor中实现了多个Nashorn引擎,并在运行。性能很差,我想是因为我使用的是高I/O和阻塞未来。 在更加熟悉游戏之后!还有他们的异步/promise模式,我试图用一个
即;每个可调用方调用progressBarUpdate(): 每个doSomeStuff()都有自己的异常处理,如果发生错误或抛出异常,则返回一个空值。这就是为什么返回类型是List,并且在这种情况下返回null的原因。调用项和它们返回的文件列表之间没有交叉,它们都维护自己的文件列表。 我发现它工作得很好,但偶尔会抛出窗体的InterruptedException: 我修改了代码,使条件nv>=m
如何使用Java8 Nashorn安全地执行用户提供的JS代码? 该脚本为一些基于servlet的报告扩展了一些计算。该应用程序有许多不同的(不受信任的)用户。脚本应该只能访问JavaObject和定义的成员返回的那些。默认情况下,脚本可以使用Class.forName()(使用我提供的对象的. getClass())实例化任何类。有没有什么方法可以禁止访问任何我没有明确指定的java类?
问题内容: 我对JVM内部的了解是,如果引用未正确发布,则不同的线程有可能看到相同字段的不同值。 我的问题是: Spring beans容器可以保证安全发布吗? 如果没有,我应该使用我所有的豆吸气剂和装塞器还是使用?还是使用字段和构造函数初始化? 我认为这可能只是单例bean的问题,因为原型bean是根据请求线程按需创建的。我的理解正确吗? 问题答案: 正如Evgeniy所说,应用程序上下文的初始
我对JVM内部的了解是,如果引用没有正确发布,那么不同的线程有可能看到相同字段的不同值。 我的问题是:Spring beans容器保证安全发布吗?如果不是,我应该让所有bean getter和setter还是使用?或者可能使用字段和构造函数初始化? 我假设这可能只是单例bean的问题,因为原型bean是从请求线程按需创建的。我的理解正确吗?
如果以下代码在多线程应用程序中可以工作,您可以帮助我吗。 这是我的Java脚本,将由Nashorn评估 这就是我创建脚本引擎的方式 在使用Testng进行测试时,此操作不会出现任何错误 测试结果1-请注意,有些数据是重复的 但是,如果我添加"并行=true"到@DataProvider我的脚本开始失败 测试结果2-请注意,重复一些数据,以表明相同的参考编号可能在测试过程中随机失败 有人可以确认我是