単一の Java ScriptEngine を使用して複数の評価を同期的に実行する方法は?
例えば
method1 に含まれるもの
sce.eval(code1);
method2 に含まれるもの
sce.eval(code2);
両方のメソッドが同期されている場合、評価は同時に実行されます
単一の Java ScriptEngine を使用して複数の評価を同期的に実行する方法は?
例えば
method1 に含まれるもの
sce.eval(code1);
method2 に含まれるもの
sce.eval(code2);
両方のメソッドが同期されている場合、評価は同時に実行されます
Synchronized and concurently doesn't fit together as one is the opposite of the other. If the eval method is synchronized you need 2 instances of the scriptengine with the same context, if it is not here comes an explanation on doing parallel/concurrent execufion.
If you want to run both method concurrently, you need more than one thread running as a single thread will sequentially run through it's execution pipeline.
Synchronized means it is thread safe and will queue all the calls made to any synchronized method of a class. For example, if m1 and m2 are synchronized, thread1 calls m1 and thread2 calls m2, the first one that will reach their respctive method will run correctly ehile the second one will wait 'til the other has exit (not totally true) the method to execute the inner code of it's method..
Now, you can take a look at the class Thread, ExecutorService and Executors if you want to run multiple threada at the same time and each will run it's own pipeline/execution atack.
Finally if you want both thread to share the same script engine, you'll have to use the same reference of that object, best way by providing it to the constructor of your object.
But, this is where problems occurs. If the script engine doesn't handle concurrency well, this might lead to some obscur weird behavior so you'll have to read the spec of the scrupt engine and validate if the implementation you are using is thread safe (hence concurrently execution safe).
Simple example :
public void launchAsync(final String code) {
new Thread() {
public void run() {
engine.eval(code);
}
}.run();
}
This will execute the code asynchronously than the main thread meaning that calling the method twice will run them in parallel (in a different thread than this one).