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