Dúvida sórdida (Thread)

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

[quote=“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[/quote]

é 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 &quot;eterno&quot;

...
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…

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é +

valeu pela força galera

Foi o método run que esqueci de implementar]

Agora o programa está tinindo