example ejemplo java process

example - process java ejemplo



java native Process timeout (6)

Por el momento, ejecuto un proceso nativo usando lo siguiente:

java.lang.Process process = Runtime.getRuntime().exec(command); int returnCode = process.waitFor();

Supongamos que en lugar de esperar a que el programa regrese, deseo terminar si ha transcurrido un cierto tiempo. ¿Cómo hago esto?


¿Qué hay de la manera Groovy

public void yourMethod() { ... Process process = new ProcessBuilder(...).start(); //wait 5 secs or kill the process waitForOrKill(process, TimeUnit.SECONDS.toMillis(5)); ... } public static void waitForOrKill(Process self, long numberOfMillis) { ProcessRunner runnable = new ProcessRunner(self); Thread thread = new Thread(runnable); thread.start(); runnable.waitForOrKill(numberOfMillis); } protected static class ProcessRunner implements Runnable { Process process; private boolean finished; public ProcessRunner(Process process) { this.process = process; } public void run() { try { process.waitFor(); } catch (InterruptedException e) { // Ignore } synchronized (this) { notifyAll(); finished = true; } } public synchronized void waitForOrKill(long millis) { if (!finished) { try { wait(millis); } catch (InterruptedException e) { // Ignore } if (!finished) { process.destroy(); } } } }


Así es como lo hace Plexus CommandlineUtils:

Process p; p = cl.execute(); ... if ( timeoutInSeconds <= 0 ) { returnValue = p.waitFor(); } else { long now = System.currentTimeMillis(); long timeoutInMillis = 1000L * timeoutInSeconds; long finish = now + timeoutInMillis; while ( isAlive( p ) && ( System.currentTimeMillis() < finish ) ) { Thread.sleep( 10 ); } if ( isAlive( p ) ) { throw new InterruptedException( "Process timeout out after " + timeoutInSeconds + " seconds" ); } returnValue = p.exitValue(); } public static boolean isAlive( Process p ) { try { p.exitValue(); return false; } catch (IllegalThreadStateException e) { return true; } }


Necesitaría un 2. hilo que interrumpe el hilo que llama a .waitFor (); Se necesitará alguna sincronización no trivial para que sea robusta, pero los conceptos básicos son:

TimeoutThread:

Thread.sleep(timeout); processThread.interrupt();

ProcessThread:

try { proc.waitFor(); } catch (InterruptedException e) { proc.destroy(); }


Si está utilizando Java 8, simplemente puede usar el nuevo waitFor con tiempo de espera :

Process p = ... if(!p.waitFor(1, TimeUnit.MINUTE)) { //timeout - kill the process. p.destroy(); // consider using destroyForcibly instead }


Todas las otras respuestas son correctas, pero se pueden hacer más robustas y eficientes utilizando FutureTask.

Por ejemplo,

private static final ExecutorService THREAD_POOL = Executors.newCachedThreadPool(); private static <T> T timedCall(Callable<T> c, long timeout, TimeUnit timeUnit) throws InterruptedException, ExecutionException, TimeoutException { FutureTask<T> task = new FutureTask<T>(c); THREAD_POOL.execute(task); return task.get(timeout, timeUnit); } try { int returnCode = timedCall(new Callable<Integer>() { public Integer call() throws Exception { java.lang.Process process = Runtime.getRuntime().exec(command); return process.waitFor(); } }, timeout, TimeUnit.SECONDS); } catch (TimeoutException e) { // Handle timeout here }

Si lo hace de forma repetida, el grupo de subprocesos es más eficiente porque almacena en caché los subprocesos.


acabo de modificar un poco de acuerdo a mi requerimiento. el tiempo de espera es de 10 segundos aquí. proceso se destruye después de 10 segundos si no está saliendo.

public static void main(String arg[]) { try{ Process p =Runtime.getRuntime().exec("/"C:/Program Files/VanDyke Software/SecureCRT/SecureCRT.exe/""); long now = System.currentTimeMillis(); long timeoutInMillis = 1000L * 10; long finish = now + timeoutInMillis; while ( isAlive( p ) ) { Thread.sleep( 10 ); if ( System.currentTimeMillis() > finish ) { p.destroy(); } } } catch (Exception err) { err.printStackTrace(); } } public static boolean isAlive( Process p ) { try { p.exitValue(); return false; } catch (IllegalThreadStateException e) { return true; } }