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.