Duvida com thread

4 respostas
Roccha

Ola a todos!!!

Estou com uma dúvida em relação a Thread. Estou implementando um programa para a faculdade (utilizando swing) que utiliza [b]Algoritmos de Ordenação[/b], que funciona da seguinte maneira:

1º - O usuário escolhe se ele quer gerar uma array de forma aleatória, crescente ou decrescente informando a quantide de elementos da array;
2º - Escolhe um método de ordenação (Bubble, Selection, Merge, Heap, Quick Sort, etc) e clica em um botão para inicar a ordenação.

Problema: Para que a tela não fique “travada” dependendo do tamanho da array a ser ordenado. Tentei utilizar uma outra thread para fazer a ordenação. Inclusive a minha classe de ordenação implementa Runnable.
Fiz da seguinte forma:

Ao pressionar o botão de Ordenação:

Ordenacao ord = new Ordenacao();

//uso alguns métodos

//Tento separar a ordenação da thread Main
Thread t = new Thread(ord);
            Thread main = Thread.currentThread();
            t.start();
            synchronized (main)
            {
                try
                {
                    while(t.isAlive())
                    {
                        main.wait();
                    }

                    t.join();
                }
                catch(InterruptedException ie)
                {
                    ie.printStackTrace();
                    System.out.println("ERRO AO RECUPERAR THREAD.");
                }
           }

Classe de Ordenação:

private synchronized void selecionarAlgoritmo()
    {
        synchronized (this) 
        {
                    this.arrayOrdenado = this.quickSort(this.conjunto,this.qtde);
        }
        
        try
        {
            // Notifica a Thread Main que a ordenação já foi concluída
            this.notify();
        }
        catch(Exception e)
        {
            System.out.println("ERRO AO EXECUTAR THREAD. " +      e.getMessage());
        }
    }

Não sei ao certo se desta forma esta correto. Mas mesmo assim o meu Frame fica congelando aguardando a ordenação.

Alguma dica para que o meu Frame não fique “congelado” ?

Pesquisei em alguns lugares e achei que poderia utilizar um ProgressBar para que o usuário pudesse perceber que a ordenação esta ocorrendo, tentei utilizar o Indeterminate mode do ProgressBar mas não obitve sucesso por este também ficou travado. Gostaria se possível alguma ajuda com relação a isto também.

Agradeço desde já.

PS: Sou novo no forum e antes de postar este tópico eu tentei utilizar as melhores práticas para colocar a minha dúvida. Caso eu não tenha me expressado muito bem, por favor me digam.

4 Respostas

marcosbrandao

Seja Bem Vindo ao Portal.

Cara, não sei se eh bem isso que vc esta procurando, mas fiz aqui em um projeto de swing este codigo algo parecido com o que vc quer.

Eu clico em um botão e este botão executa um metodo com processo demorado, entao ele executa uma thread para não travar a tela:
jbtnProcurar.addActionListener(new ActionListener(){
	public void actionPerformed(ActionEvent e) {	
		pool = Executors.newSingleThreadExecutor();
		

		pool.execute(new Runnable(){

			public void run() {
				abreFileChooser();
			}					
		});
	}			
});
keller

Jogar um janela de aguarde processando nao resolve ?

Se nao resolver da uma olhada no Swingworker / algo do tipo desse nome funciona bem…

ViniGodoy

Dá uma olhada nessa implementação:
http://www.guj.com.br/posts/list/50321.java#264645

Ela faz o calculo de um primo em outra thread e depois aguarda o resultado para exibi-lo no final.

Roccha

ViniGodoy, dei uma olhada no programa que vc me passou e parece que é isso mesmo o que eu estava precisando. Vou alterar o meu código e depois eu coloco o resultado aqui.

Obrigado a todos por me ajudarem! Valew

Criado 3 de abril de 2007
Ultima resposta 5 de abr. de 2007
Respostas 4
Participantes 4