JDK中的脚本引擎ScriptEngine并发测试
测试代码:
public class JSThread {
static ScriptEngine JS = new ScriptEngineManager().getEngineByName("js");
static Map<String,Boolean> list = new HashMap<String,Boolean>();
static {
list.put("10<6 && 6<=50",false);
list.put("50<6 && 6<=100",false);
list.put("5<2 && 2<=15",false);
list.put("4>200",false);
list.put("5<2 && 2<=500",false);
list.put("0<4 && 4<=6.5",true);
list.put("0.5<5 && 5<=1",false);
list.put("(-30<=9 && 9<-20) || (40<=9 && 9<45)",false);
}
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < 1000; i++) {
executorService.execute(JSThread::test);
}
}
public static void test() {
for (int i = 0; i < 200; i++) {
try {
System.out.println("************************ "+i+" **************************");
System.out.println("************************ "+Thread.currentThread().getName()+" **************************");
Set<String> stringSet = JSThread.list.keySet();
int v = ThreadLocalRandom.current().nextInt(1, stringSet.size() - 1);
String[] arr=stringSet.toArray(new String[]{});
String ex = arr[v];
Boolean is = JSThread.list.get(ex);
if(!(is.equals((Boolean) JSThread.JS.eval(ex)))){
throw new Exception("计算出错了");
}
System.out.println(ex +" ******* "+JSThread.JS.eval(ex));
}catch (Exception e) {
e.printStackTrace();
}
}
}
}
如上代码1000个线程共随机执行了10万次表达式计算,无一次报错。
结论:JDK脚本引擎ScriptEngine
支持并发。