Pegar resultado de uma thread

2 respostas
BrunoLaser

Olá sou iniciante em Java e tenho uma dúvida sobre threads: eu estou fazendo um programa usando o netbeans (Swing: Testing.java), e ao clicar em um botão é chamada uma threads(PrintTask.java) que a cada 3 segundos procura um arquivo em um diretório e se caso encontrar(ele pode ser criado a qualquer momento por isso a procura a cada 3 segundos) é exibido uma mensagem ( System.out.printf(“achou/não achou”) ) , até aqui eu consegui fazer, o meu problema é que caso ache o arquivo ao invéz de imprimir a mensagem na tela, ela seja enviada ao Testing.java,… alguém pode me ajudar?

Código do botão:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {  
   PrintTask task1 = new PrintTask("thread1");
   ExecutorService threadExecutor = Executors.newFixedThreadPool(1);
   threadExecutor.execute(task1);
}

Código do PrintTask.java:

import java.io.File;

public class PrintTask implements Runnable {
    private int sleepTime;
    private String threadName;

    public PrintTask(String name) {
        threadName = name; // configura nome da thread
        sleepTime = 3000;// tempo em segundos
    }
    
    
    public void run() {
        try{ 
            File f = new File("/usr/local/Teste/Nome");

            while(true){
                Thread.sleep(sleepTime); 
                if(f.exists()){
                    System.out.printf("Achou!!!\n");
                } else{
                    System.out.printf("Não Achou!!!\n");
                    System.exit(0) // caso não ache o programa vai encerrar
                }
            }
        }
        catch(InterruptedException exception){
            exception.printStackTrace();
        }
    }

}

toda ajuda será bem vinda :slight_smile:

2 Respostas

ViniGodoy

Cria uma referência a classe Testing em seu Runnable e chame algum método dele. Para tornar a coisa mais genérica, use o padrão Observer. Ou seja, cada PrintTask pode ter uma lista de “TaskCompletionListeners” e notificar um método desses listeners sempre que um PrintTask for completado. Depois, você só torna Testing um listener desses.

Uma coisa ao invés de:

PrintTask task1 = new PrintTask("thread1"); ExecutorService threadExecutor = Executors.newFixedThreadPool(1); threadExecutor.execute(task1);

Não era mais fácil fazer:

new Thread(new PrintTask("thread1")).start();

Finalmente, essa variável threadName não está servindo para nada. Você poderia remover completamente o atributo e o parâmetro do construtor.

ViniGodoy

Considere também a possibilidade de usar Callables e Futures, quando possível. Mas acho que esse não será o caso do seu problema.

O Callable é um Runnable que retorna valor. Depois, através da classe Future, você retorna o resultado.

Veja um exemplo de implementação aqui:
http://www.guj.com.br/posts/list/50321.java#264620

Criado 24 de maio de 2007
Ultima resposta 24 de mai. de 2007
Respostas 2
Participantes 2