[size=12][size=18]Tenho estas três classes: A 1ª representa uma árvore(vetor de vizinhança), a 2ª é a thread e a 3ª classe é a principal. As threds criadas na classe principal deveriam ser executas em paralelo. Alguém poderia me ajudar a saber se estão realmente em paralelo??? Ou uma forma melhor de colocá-las em paralelo.
Desde já agradeço a ajuda.[/size][/size]
packagepointerJumping;importjava.util.Scanner;publicclassArvore{// Vetor que representa uma árvore.intvizinhos[];intnum_vertices;// ConstrutorArvore(inttamanho){vizinhos=newint[tamanho];num_vertices=tamanho;}// Seleciona os vizinhos.publicvoidsetParent(){for(inti=0;i<vizinhos.length;i++){System.out.println("Diga o vizinho do nó "+i+":");Scannerteclado=newScanner(System.in);vizinhos[i]=teclado.nextInt();}}// Imprime a raiz de um dado nó.publicvoidimprime(intno){System.out.println("Nó "+no+" possui raiz "+vizinhos[no]);}}
packagepointerJumping;importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;classPointer_JumpingimplementsRunnable{privateStringthreadName;privateArvorearv;privateintindice;privateLockpointerLock=newReentrantLock();//ReentrantLock emplementa a inteface Lock.publicPointer_Jumping(Stringname,Arvorearvore,intind){threadName=name;arv=arvore;indice=ind;}publicvoidrun(){System.out.println(threadName+"Trabalhando!!!");pointerLock.lock();try{while(arv.vizinhos[indice]!=arv.vizinhos[arv.vizinhos[indice]]){//System.out.println(threadName + " Passou pelo while!!!");arv.vizinhos[indice]=arv.vizinhos[arv.vizinhos[indice]];//System.out.println(threadName + " Passou pela atribuicao!!!");}arv.imprime(indice);}finally{System.out.println(threadName+"Acabou!!!");pointerLock.unlock();}}}
packagepointerJumping;publicclassTester{publicstaticvoidmain(String[]args)throwsInterruptedException{//Criação da árvore para teste.Arvorearv=newArvore(5);arv.setParent();// Criação de objetos da classe Pointer_Jumping.Pointer_Jumpingpj1=newPointer_Jumping("thread 1",arv,0);Pointer_Jumpingpj2=newPointer_Jumping("thread 2",arv,1);Pointer_Jumpingpj3=newPointer_Jumping("thread 3",arv,2);Pointer_Jumpingpj4=newPointer_Jumping("thread 4",arv,3);Pointer_Jumpingpj5=newPointer_Jumping("thread 5",arv,4);// Criação das Threads a partir de um objeto da classe Pointer_JumpingThreadthreadComRunnable1=newThread(pj1);ThreadthreadComRunnable2=newThread(pj2);ThreadthreadComRunnable3=newThread(pj3);ThreadthreadComRunnable4=newThread(pj4);ThreadthreadComRunnable5=newThread(pj5);// Startando as Threads.threadComRunnable1.start();threadComRunnable2.start();threadComRunnable3.start();threadComRunnable4.start();threadComRunnable5.start();}}
Como posso saber se está em paralelo??? No modo debug do eclipse parece que está sequncial!!!
E outro porblema é que as threads não começam a trabalhar no mesmo instante, pelo menos o que eu acho.
ViniGodoy
Ponha um break point no terceiro start.
Você vai ver que, embora a thread do main esteja parada, duas outras threads vão ter aparecido.
E também não tem “threads ao mesmo tempo”, por uma uma questão simples. Quantos processadores você tem? Para serem todas exatamente ao mesmo tempo, você precisaria de um para cada thread. Isso ainda se nenhuma resolvesse passear por uma região de exclusão mútua no seu código (até onde vi, seu código não tem nenhuma).
ViniGodoy
Só para constar. A saída no meu micro foi:
thread 1Trabalhando!!!
thread 3Trabalhando!!!
thread 2Trabalhando!!!
thread 5Trabalhando!!!
thread 4Trabalhando!!!
Isso indica claramente uma execução paralela. Se fosse sequencial a saída seria:
thread 1Trabalhando!!!
thread 1Acabou!!!
thread 2Trabalhando!!!
thread 2Acabou!!!
E assim por diante…
Eu tenho um processador dual core e rodo no WinXP SP2. É bom lembrar que quem define a ordem de execução das threads, bem como que thread entrará em que processador é o SO.
D
dominguesph
A minha saída foi assim:
Diga o vizinho do nó 0:
1
Diga o vizinho do nó 1:
2
Diga o vizinho do nó 2:
3
Diga o vizinho do nó 3:
4
Diga o vizinho do nó 4:
4
thread 1Trabalhando!!!
Nó 0 possui raiz 4
thread 1Acabou!!!
thread 3Trabalhando!!!
Nó 2 possui raiz 4
thread 2Trabalhando!!!
thread 3Acabou!!!
thread 5Trabalhando!!!
Nó 1 possui raiz 4
thread 4Trabalhando!!!
Nó 4 possui raiz 4
thread 2Acabou!!!
Nó 3 possui raiz 4
thread 5Acabou!!!
thread 4Acabou!!!
Por isso estou com dúvidas. Cada hora que rodo o programa dá um resultado diferente, isto deve ser por conta do SO que determina qual thread deve ter o processamento em determinado tempo. Queria que pelo menos as mensagens:
thread 1Trabalhando!!!
thread 2Trabalhando!!! …
Ficassem igual a de vc. Antes de rodar vc Modificou alguma coisa no código?
Valew
D
dominguesph
Ou seja queria que todas startassem juntas.
ViniGodoy
Infelizmente, vai ficar querendo.
Em threads, não tem como garantir qualquer tipo de ordem. É o seu SO que faz isso.
Não modifiquei uma linha do código se quer. Simplesmente copiei, colei e rodei!