Использование Java ScriptEngine для синхронного выполнения множественной оценки

Как использовать один Java ScriptEngine для синхронного выполнения нескольких оценок?

например

method1 включает в себя

sce.eval(code1);

method2 включает в себя

sce.eval(code2);

тогда оценки выполнялись одновременно, если оба метода синхронизированы

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();
}

Это выполнит код асинхронно, чем основной поток, а это означает, что вызов метода дважды будет запускать их параллельно (в другом потоке, чем этот).

Другие вопросы по тегам