Dúvida sórdida (Thread)

3 respostas
F

Turma,

Estou fazendo uma mini-aplicação em que tenho que executar um processo eternamente <while (true)>, processo este que não usa muita cpu, pelo

menos em tese (File.listFiles()).
Tenho uma classe para a interface gráfica que instancia outra classe que contem este método “eterno” a partir de um clique de um botão. Logo

após o instanciamento é chamada este método chamado Monitoramento.

Problema: Se eu usar o <while (true) Obj.Monitoramento();> o processamento fica altíssimo. Na realidade eu pensava que a JVM cuidasse de

manter o processamento num nivel baixo, mas não é o que acontece. Sem esta alternativa eu decidi executar o processo de “tempos em tempos”

que até é mais vantajoso para minha finalidade, bom… é aí que quero a sabedoria de vcs:

Estou usando o <Thread.sleep()>, ou seja, extendi a classe que tem o método Monitoramento de Thread <public class Arquivo extends Thread> e

na classe da interface gráfica estou usando <while (true){ … ObjArq.sleep(1000); ObjArq.Monitoramento(); …}>. Esta solução resolve a

questão do processamento, mas surgiu outro problema:

Na interface gráfica, no clique do botão que executa o <while (true){ … ObjArq.sleep(1000); ObjArq.Monitoramento(); …}>. No clique do

botão a tela simplismente congela e fica inacessível. Fica sempre naquele while (true) e a tela não fica liberada nem para fecha-la.

Preciso de um help para que o Monitoramento seja executado de “tempos em tempos” e que a interface gráfica fique liberada neste tempo.

Segue abaixo o trecho do código das duas classes:

public class Tela extends JFrame implements ActionListener{



public void actionPerformed(ActionEvent e){

if (e.getSource()==this.btativar){

ObjArq = new Arquivo();

while (true){

try{

ObjArq.sleep(1000);

ObjArq.Monitoramento();

}}



}
public class Arquivo extends Thread{



public void Monitoramento(){}



}

Valeu pela força

Fábio Camelo

3 Respostas

C

“FabioCamelo”:
Turma,

Estou fazendo uma mini-aplicação em que tenho que executar um processo eternamente <while (true)>, processo este que não usa muita cpu, pelo

menos em tese (File.listFiles()).
Tenho uma classe para a interface gráfica que instancia outra classe que contem este método “eterno” a partir de um clique de um botão. Logo

após o instanciamento é chamada este método chamado Monitoramento.

Problema: Se eu usar o <while (true) Obj.Monitoramento();> o processamento fica altíssimo. Na realidade eu pensava que a JVM cuidasse de

manter o processamento num nivel baixo, mas não é o que acontece. Sem esta alternativa eu decidi executar o processo de “tempos em tempos”

que até é mais vantajoso para minha finalidade, bom… é aí que quero a sabedoria de vcs:

Estou usando o <Thread.sleep()>, ou seja, extendi a classe que tem o método Monitoramento de Thread <public class Arquivo extends Thread> e

na classe da interface gráfica estou usando <while (true){ … ObjArq.sleep(1000); ObjArq.Monitoramento(); …}>. Esta solução resolve a

questão do processamento, mas surgiu outro problema:

Na interface gráfica, no clique do botão que executa o <while (true){ … ObjArq.sleep(1000); ObjArq.Monitoramento(); …}>. No clique do

botão a tela simplismente congela e fica inacessível. Fica sempre naquele while (true) e a tela não fica liberada nem para fecha-la.

Preciso de um help para que o Monitoramento seja executado de “tempos em tempos” e que a interface gráfica fique liberada neste tempo.

Segue abaixo o trecho do código das duas classes:

public class Tela extends JFrame implements ActionListener{



public void actionPerformed(ActionEvent e){

if (e.getSource()==this.btativar){

ObjArq = new Arquivo();

while (true){

try{

ObjArq.sleep(1000);

ObjArq.Monitoramento();

}}



}
public class Arquivo extends Thread{



public void Monitoramento(){}



}

Valeu pela força

Fábio Camelo

é facil maluko… vamo deixar o sleep à (nem sei si vai crase) cuidados da classe Arquivo, como? oia ai…

// dentro da classe arquivo tem que ter o metodo run&#40;&#41; *implementação obrigatoria
// entro desse run&#40;&#41; vamo por o loop "eterno"

...
public void run&#40;&#41; &#123;
   while &#40;true&#41;
   &#123;
      // faz oq tiver que fazer...
                 try&#123;
                     sleep&#40;1000&#41;;
                     this.Monitoramento&#40;&#41;;
      &#125;...&#125;
    ...
   &#125;
&#125;

já na classe que tem a interface, vc instancia um objeto Arquivo e da um start nele… assim num vai congelar a tela e vai deixara thread rodando sozinha…

classe Janelaseila.. &#123;

...
public void actionPerformed&#40;ActionEvent e&#41;&#123;
  if &#40;e.getSource&#40;&#41;==this.btativar&#41;&#123;
   ObjArq = new Arquivo&#40;&#41;;
   ObjArq.start&#40;&#41;; //Obj é minusculo!
   &#125;
&#125;

entendeu cara? qq coisa da um grito ai…

F

Uma opção mais convencional seria usar métodos sincronizados com wait() e notify();

Isso é um problema clássico no uso de threads, e a sun desenvolveu essa solução(Sincronização de métodos). Só que é um assunto meio complicado para explicar qui pelo forum…
O ideal era vc procurar um tutorial avançado sobre threads ou até mesmo comprar um livro de fundamentos de java, que envolva esse assunto.

Usando o wait() e notify() o seu método só será executado se ele for notificado que pode executar… e quando vc chamar o metodo wait() ele será colocado em espera…

espero ter ajudado e não complicado mais… mas é dificil não complicar quando o assunto é threads…

té +

F

valeu pela força galera

Foi o método run que esqueci de implementar]

Agora o programa está tinindo

Criado 16 de dezembro de 2004
Ultima resposta 18 de dez. de 2004
Respostas 3
Participantes 3