Após 4 dias enfrentando um problema com uma simulação escrita em Java, finalmente descobri a solução.
O que estava acontecendo era o seguinte: Em um trecho do meu código, chamava o método “Runtime.getRuntime().exec” para executar um programa externo,
mais precisamente um Shell Script. O script começava a ser executado perfeitamente, entretanto, em determinado momento, parecia que ele parava e nada mais acontecia. Pesquisando, através do Google, descobri um artigo que descrevia exatamente
como resolver o problema: http://kylecartmell.com/?p=9
O que acontece, na verdade, é que, segunda a API JAVA 6, o “output” do comando externo executado deve ser consumido imediatamente, mesmo que a sua aplicação não utilize. Caso esse procedimento não seja realizado, o sub-processo pode ser bloqueado ou mesmo entrar em deadlock.
Segue, abaixo, um exemplo que ilustra o que fiz para solucionar o problema:
import java.util.*; import java.io.*; class StreamGobbler extends Thread { InputStream is; String type; StreamGobbler(InputStream is, String type) { this.is = is; this.type = type; } public void run() { try { InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String line=null; while ( (line = br.readLine()) != null) System.out.println(type + ">" + line); } catch (IOException ioe) { ioe.printStackTrace(); } } } public class Principal { try { p = Runtime.getRuntime().exec("simulacao.sh"); StreamGobbler errorGobbler = new StreamGobbler(p.getErrorStream(), "ERROR"); // any output? StreamGobbler outputGobbler = new StreamGobbler(p.getInputStream(), "OUTPUT"); // kick them off errorGobbler.start(); outputGobbler.start(); // any error??? int exitVal = p.waitFor(); System.out.println("Código de Retorno: "+exitVal); } catch (IOException ex) { Logger.getLogger(Main.class.getName()). log(Level.SEVERE, null, ex); } catch (InterruptedException ex) { Logger.getLogger(Main.class.getName()). log(Level.SEVERE, null, ex); } }
Mais informações sobre problemas relacionados ao Process podem ser lidas AQUI.
0sem comentários ainda