0

如何使用单个 Java ScriptEngine 同步执行多个评估?

例如

方法1包括

sce.eval(code1);

方法2包括

sce.eval(code2);

如果两种方法同步,则​​评估同时运行

4

1 回答 1

1

同步和并发不适合在一起,因为一个与另一个相反。如果 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();
}

这将与主线程异步执行代码,这意味着调用该方法两次将并行运行它们(在与此不同的线程中)。

于 2012-06-09T13:08:52.553 回答