Input Streams blockeados e Threads

Olá.

Eu não tenho nenhum caso assim, mas estava curioso por uma solução p/ o seguinte problema (q eu não sei resolver).

Suponhamos que eu tenha um programa de comando de linha “comando.exe” que executa e, dependendo do input, exiba informações pelo stdout ou stderr.

Agora, eu quero ler as informações de output…independente do canal usado (ou seja, quero ler as duas ao mesmo tempo). Resposta, uso threads. Certo?

Process process = Runtime.getRuntime().exec(“comando.exe”);

  DataInputStream processNormalOutput = new DataInputStream(process.getInputStream());
  DataInputStream processErrorOutput = new DataInputStream(process.getErrorStream());

Mas, suponhamos que um comando só exiba informações por um dos canais, não pelo outro. Eu preciso parar a outra thread quando eu descubro que o programa não vai mais soltar informação (Por exemplo, já peguei o output por uma delas e descobri que acabou). Mas a outra thread está bloqueada esperando input. Eu não posso interromper uma thread que está bloqueada, posso? Como?

É isso…será que alguém sabe resolver esse problema…ou a thread tem que viver eternamente, esperando um input que nunca virá, até o final da vida do programa?

Até +

D u i

duinewbah,

uma ótima solução seria realmente o uso de threads, para parar ela é só dar um stop();

ex:
Thread proc1 = new Thread();
Thread proc2 = new Thread(proc1);

na classe da Thread2 se caso ele receber alguma interrupção/exceção ou algo, vc só dá um proc1.stop();

Fechou.
Espero ter ajudado,
Abraço,
Maicon

[quote=“duinewbah”]Olá.

Eu não tenho nenhum caso assim, mas estava curioso por uma solução p/ o seguinte problema (q eu não sei resolver).

Suponhamos que eu tenha um programa de comando de linha “comando.exe” que executa e, dependendo do input, exiba informações pelo stdout ou stderr.

Agora, eu quero ler as informações de output…independente do canal usado (ou seja, quero ler as duas ao mesmo tempo). Resposta, uso threads. Certo?

Process process = Runtime.getRuntime().exec(“comando.exe”);

  DataInputStream processNormalOutput = new DataInputStream(process.getInputStream());
  DataInputStream processErrorOutput = new DataInputStream(process.getErrorStream());

Mas, suponhamos que um comando só exiba informações por um dos canais, não pelo outro. Eu preciso parar a outra thread quando eu descubro que o programa não vai mais soltar informação (Por exemplo, já peguei o output por uma delas e descobri que acabou). Mas a outra thread está bloqueada esperando input. Eu não posso interromper uma thread que está bloqueada, posso? Como?

É isso…será que alguém sabe resolver esse problema…ou a thread tem que viver eternamente, esperando um input que nunca virá, até o final da vida do programa?

Até +

D u i[/quote]

Cria um campo boolean na classe que sera a thread e baseia o loop no camp:

boolean abc = true;

while(continuar) 
//blabla
}
Programa {
 cria thread1 rodand baseada em um while(boolean), no qual o boole
 cria thread2
 continua o controle....
 se(quero parar uma thread) {
    thread1.continuar = false;
 }
}

:wink:

[quote=“maicon_b”]duinewbah,

uma ótima solução seria realmente o uso de threads, para parar ela é só dar um stop();

ex:
Thread proc1 = new Thread();
Thread proc2 = new Thread(proc1);

na classe da Thread2 se caso ele receber alguma interrupção/exceção ou algo, vc só dá um proc1.stop();

Fechou.
Espero ter ajudado,
Abraço,
Maicon[/quote]

É deprecated fazer isso :slight_smile:

A thread pode ser parada em um estado inconsistente, a solucao proposta pela sun é a que coloquei lá emcima, execução baseada em flag setável :slight_smile:

[quote=“mavi”][quote=“duinewbah”]Olá.

Eu não tenho nenhum caso assim, mas estava curioso por uma solução p/ o seguinte problema (q eu não sei resolver).

Suponhamos que eu tenha um programa de comando de linha “comando.exe” que executa e, dependendo do input, exiba informações pelo stdout ou stderr.

Agora, eu quero ler as informações de output…independente do canal usado (ou seja, quero ler as duas ao mesmo tempo). Resposta, uso threads. Certo?

Process process = Runtime.getRuntime().exec(“comando.exe”);

  DataInputStream processNormalOutput = new DataInputStream(process.getInputStream());
  DataInputStream processErrorOutput = new DataInputStream(process.getErrorStream());

Mas, suponhamos que um comando só exiba informações por um dos canais, não pelo outro. Eu preciso parar a outra thread quando eu descubro que o programa não vai mais soltar informação (Por exemplo, já peguei o output por uma delas e descobri que acabou). Mas a outra thread está bloqueada esperando input. Eu não posso interromper uma thread que está bloqueada, posso? Como?

É isso…será que alguém sabe resolver esse problema…ou a thread tem que viver eternamente, esperando um input que nunca virá, até o final da vida do programa?

Até +

D u i[/quote]

Cria um campo boolean na classe que sera a thread e baseia o loop no camp:

boolean abc = true;

while(continuar) 
//blabla
}
Programa {
 cria thread1 rodand baseada em um while(boolean), no qual o boole
 cria thread2
 continua o controle....
 se(quero parar uma thread) {
    thread1.continuar = false;
 }
}

;)[/quote]

Oi Mavi! :slight_smile:

Exatamente. O Stop é deprecated e por isso esse problema é mais “tricky” do que parece à primeira vista…

O problema com a sua solução Mavi, é que como a segunda thread está parada esperando um IO (que nunca acontecerá), ela jamais alcançará a condição do loop, mesmo que a outra Thread a mude p/ false…portanto ela continuará viva e bloqueada esperando o IO mesmo com a outra solução =)

Mais sugestões? :slight_smile:

[quote=“mavi”][quote=“duinewbah”]Olá.

Eu não tenho nenhum caso assim, mas estava curioso por uma solução p/ o seguinte problema (q eu não sei resolver).

Suponhamos que eu tenha um programa de comando de linha “comando.exe” que executa e, dependendo do input, exiba informações pelo stdout ou stderr.

Agora, eu quero ler as informações de output…independente do canal usado (ou seja, quero ler as duas ao mesmo tempo). Resposta, uso threads. Certo?

Process process = Runtime.getRuntime().exec(“comando.exe”);

  DataInputStream processNormalOutput = new DataInputStream(process.getInputStream());
  DataInputStream processErrorOutput = new DataInputStream(process.getErrorStream());

Mas, suponhamos que um comando só exiba informações por um dos canais, não pelo outro. Eu preciso parar a outra thread quando eu descubro que o programa não vai mais soltar informação (Por exemplo, já peguei o output por uma delas e descobri que acabou). Mas a outra thread está bloqueada esperando input. Eu não posso interromper uma thread que está bloqueada, posso? Como?

É isso…será que alguém sabe resolver esse problema…ou a thread tem que viver eternamente, esperando um input que nunca virá, até o final da vida do programa?

Até +

D u i[/quote]

Cria um campo boolean na classe que sera a thread e baseia o loop no camp:

boolean abc = true;

while(continuar) 
//blabla
}
Programa {
 cria thread1 rodand baseada em um while(boolean), no qual o boole
 cria thread2
 continua o controle....
 se(quero parar uma thread) {
    thread1.continuar = false;
 }
}

;)[/quote]

Oi Mavi! :slight_smile:

Exatamente. O Stop é deprecated e por isso esse problema é mais “tricky” do que parece à primeira vista…

O problema com a sua solução Mavi, é que como a segunda thread está parada esperando um IO (que nunca acontecerá), ela jamais alcançará a condição do loop, mesmo que a outra Thread a mude p/ false…portanto ela continuará viva e bloqueada esperando o IO mesmo com a outra solução =)

Mais sugestões? :slight_smile: