如何防止ScriptEngine(Nashorn)eval()阻塞线程

时间:2017-11-29 04:12:01

标签: javascript java multithreading nashorn

Image showing threads blocked on ScriptEngine Context Monitor

注意

这个问题不是关于ScriptEngine是否是线程安全的(我已经读过它),而是关于用于评估String的实际代码,而不是编译(预定)功能

背景

我编写了一个组件,用于计算由变量组成的布尔表达式。例如,如果用户提供(a && b || c),我会根据变量评估的内容将变量abc替换为true或false,然后我就是使用eval()来计算布尔表达式,它实际上是传入的String参数。

问题陈述

如附图中所示,在多线程环境中,Monitor类jdk.nashorn.internal.runtime.Context导致我的线程,每个线程都要评估一个布尔表达式在此监视器上阻塞。

问题

是否有更好的方法可以让我在多线程环境中利用此脚本引擎作为布尔表达式求值程序而不会导致线程阻塞?

简化代码片段

private static final ScriptEngineManager mgr = new ScriptEngineManager();
private static final ScriptEngine jsEngine =mgr.getEngineByName("JavaScript");
...
result = (Boolean) jsEngine.eval(expressionAsStr);
...

0 个答案:

没有答案