It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current form. For help clarifying this question so that it can be reopened, visit the help center




已关闭8年。





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

例如


method1包括

sce.eval(code1);

method2包括

sce.eval(code2);


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

最佳答案

同步和并发无法融合在一起,因为一个与另一个相反。如果eval方法是同步的,则需要2个具有相同上下文的scriptengine实例,如果不同步,此处将给出执行并行/并发执行的说明。

如果要同时运行这两种方法,则需要运行多个线程,因为单个线程将依次在其执行管道中运行。

同步意味着它是线程安全的,并且将对类的任何同步方法进行的所有调用排队。例如,如果m1和m2同步,线程1调用m1和线程2调用m2,则第一个将到达其各自方法的方法将正确运行,而第二个将等待直到另一个方法退出(并非完全正确)为止。执行其方法的内部代码。

现在,如果您想同时运行多个线程,并且每个线程都将运行其自己的管道/执行atack,则可以查看Thread,ExecutorService和Executors类。

最后,如果您希望两个线程共享同一脚本引擎,则必须使用该对象的相同引用,这是将其提供给对象的构造函数的最佳方法。

但是,这就是发生问题的地方。如果脚本引擎不能很好地处理并发,这可能会导致一些奇怪的怪异行为,因此您必须阅读scrupt引擎的规范,并验证所使用的实现是否是线程安全的(因此可以并行执行)。

简单的例子:

public void launchAsync(final String code) {
   new Thread() {
       public void run() {
           engine.eval(code);
       }
   }.run();
}


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

关于java - 使用Java ScriptEngine同步执行多个评估,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10958180/

10-16 20:22