Использование 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();
}
Это выполнит код асинхронно, чем основной поток, а это означает, что вызов метода дважды будет запускать их параллельно (в другом потоке, чем этот).