que ejecutar secuencias de comandos en un nuevo hilo usando una ExecutorService y con fecha de salida future.get
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<?> future = executor.submit(threadEvaluation);
try {
System.out.println("Started..");
future.get(100, TimeUnit.MILLISECONDS);
System.out.println("Finished!");
} catch (TimeoutException e) {
future.cancel(true);
System.out.println("Terminated!");
}
Tenga en cuenta que este enfoque no se detendrá el hilo de ejecutar el guión!Con el fin de hacerlo, ya que el hilo de ejecución se notificará la secuencia de comandos que ser interrumpido, puede crear un ContextFactory personalizada que supervisa periódicamente esta situación:
public class InterruptableContextFactory extends ContextFactory {
public static boolean initialized = false;
public static void init() {
if (!initialized) {
ContextFactory.initGlobal(new InterruptableContextFactory());
initialized = true;
}
}
@Override
protected void observeInstructionCount(Context cx, int instructionCount) {
System.out.println(instructionCount + " javascript instructions!");
if (Thread.currentThread().isInterrupted()) {
throw new Error("script execution aborted");
}
}
@Override
protected Context makeContext() {
Context cx = super.makeContext();
//set a number of instructions here
cx.setInstructionObserverThreshold(10000);
return cx;
}
}
Antes de crear cualquier objeto de contexto, es necesario configurar la aplicación para utilizar esta ContextFactory por defecto, simplemente invocar
InterruptableContextFactory.init()
Dentro de su método llamado de rescatable, puede capturar el error:
try {
cx.setOptimizationLevel(9);
cx.setInstructionObserverThreshold(10000);
ScriptableObject scope = cx.initStandardObjects();
// your code here
} catch (Error e) {
System.out.println("execution was aborted: " + e.getMessage());
} finally {
Context.exit();
}
@ Donal: esto podría pr Probablemente no funcione porque una vez que creo un nuevo hilo y empiezo a cargar y ejecutar el motor de Rhino desde el momento en que se llama al método evaluateReader() en el contexto, la ejecución del hilo se completa y el motor de Rhino gestiona internamente la ejecución. – Syam
Es por eso que sugerí ponerlo en su propio grupo de hilos; cualquier otro subproceso creado por Rhino seguirá estando en ese grupo de subprocesos (o un grupo de subprocesos hijo) por lo que aún será posible eliminarlos todos_. –