如何使用单个Java ScriptEngine同步执行多个评估?
例如
方法1包括
sce.eval(code1);
方法2包括
sce.eval(code2);
如果两个方法同步
,则评估同时进行答案 0 :(得分:1)
同步和精确地不适合在一起,因为一个是另一个的反面。如果eval方法是同步的,那么你需要2个带有相同上下文的scriptengine实例,如果不是这里就做并行/并发执行的解释。
如果要同时运行这两个方法,则需要运行多个线程,因为单个线程将依次运行它的执行管道。
同步意味着它是线程安全的,并将对类的任何同步方法进行的所有调用排队。例如,如果m1和m2是同步的,则thread1调用m1而thread2调用m2,第一个将达到其respctive方法将正确运行,而第二个将等待,直到另一个已退出(不完全为真)方法为执行它的方法的内部代码..
现在,您可以查看Thread,ExecutorService和Executors类,如果您想同时运行多个threada,并且每个都将运行它自己的管道/执行atack。
最后,如果您希望两个线程共享相同的脚本引擎,则必须使用该对象的相同引用,最好的方法是将其提供给对象的构造函数。
但是,这就是问题发生的地方。如果脚本引擎不能很好地处理并发性,这可能会导致一些令人讨厌的奇怪行为,因此您必须阅读scrupt引擎的规范并验证您使用的实现是否是线程安全的(因此同时执行安全)。
简单示例:
public void launchAsync(final String code) {
new Thread() {
public void run() {
engine.eval(code);
}
}.run();
}
这将比主线程异步执行代码,这意味着调用方法两次将并行运行它们(在与此线程不同的线程中)。