Ir para o conteúdo
ou

Software livre Brasil

 Voltar a Projeto Soft...
Tela cheia Sugerir um artigo

Marvin Lemos: Problema com java.lang.Process

1 de Novembro de 2010, 0:00 , por Software Livre Brasil - 0sem comentários ainda | Ninguém está seguindo este artigo ainda.
Visualizado 175 vezes

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.


Fonte: http://www.marvinlemos.net/?p=183

0sem comentários ainda

Enviar um comentário

Os campos são obrigatórios.

Se você é um usuário registrado, pode se identificar e ser reconhecido automaticamente.