1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Execucao de Threads na sequencia certa

Pessoal estou tentando executar uma thread da classe avaliação 'a.start()' exatamente após o término de um método da classe GA 'mutação', porem não consigo, estou fazendo dentro de um bloco sincronizado, conforme alguns exemplos que eu peguei na net , mas não executa na ordem que eu quero, que seria executar até o método mutação e só apos a finalização desse método executar a.start().


//metodo mutacao

    public  void mutacao( double tx_mutacao)          
    {
         System.out.print("mutacao");
        synchronized(this)    
        {
            while(disponivel==true)
             {
             try{

                    wait();
            }
             catch(InterruptedException e){
                e.printStackTrace();
            }
        }

        if(escolha==false)
        {


        int qt_gen;
        int i=0;

        qt_gen=  (int)(((num_gen-1)*tam_pop)*tx_mutacao)/100;




        for(i=0;i<qt_gen; i++)
        {
                int  ind;
                String muta_gen[];
                int m1, m2;
                String aux="";;

                Random  r = new Random();

                ind= r.nextInt(tam_pop);

                muta_gen=Pop_copia.get(ind).split("\\.");

                m1= r.nextInt(num_gen-1);
                m2=r.nextInt(num_gen-1);

                aux=muta_gen[m1];
                muta_gen[m1]=muta_gen[m2];
                muta_gen[m2]=aux;

                aux="";

                for(int j=0; j<num_gen-1; j++)
                {
                    aux=aux+muta_gen[j]+".";

                }

                 Pop_copia.remove(ind);
                 Pop_copia.add(ind, aux);




            }    
                Pop.clear();
                Pop.addAll(Pop_copia);
                Pop_copia.clear();  
        }
        disponivel=true;
        notify();//escolha=true;
        }

        }


//classe Avaliacao com thread 


public class Avaliacao_1 extends Thread {

    GA G;



    public void run()
    {
        //G.somaAvaliacoes=0;
         synchronized(this){

            while(G.disponivel==false){
             try{

                     wait();
             }catch(InterruptedException e){
                 e.printStackTrace();
             }

            }
            System.out.println("avaliacao");

             int ind_lin = 0;
         int ind_col=0;
         int i=0;
         int j=0;
         double []vet_avalicao= new double [G.tam_pop];


         while(j<G.tam_pop) 
        {
             //System.out.print("avaliacao");

         String[] aux2 = G.Pop_copia.get(j).split("\\.");


         G.aval_cromossomo = 0;
         G.no_falho=0;

         G.cromossomo_invalido.add(j,1);


         for( i=0;i<G.num_gen-2; i++)
         {
             ind_lin=Integer.parseInt(aux2[i]);
             ind_col=Integer.parseInt(aux2[i+1]);

            if(i==0)
            {

                   G.aval_cromossomo =G.aval_cromossomo +G.mapa[G.no_inicial-1][ind_lin-1];

                 if(G.mapa[G.no_inicial-1][ind_lin-1]==0)
                 {
                     G.aval_cromossomo+=G.punicao;
                     G.no_falho=1;
                    // G.cromossomo_invalido.add(j,0);
                    // G.cromossomo_invalido.remove(j+1);
                 }

            }    

            if(i==G.num_gen-3)
            {
                 G.aval_cromossomo=G.aval_cromossomo +G.mapa[G.no_inicial-1][ind_col-1];

                 if(G.mapa[G.no_inicial-1][ind_col-1]==0)
                 {
                     G.aval_cromossomo+=G.punicao;
                     G.no_falho=1;
                     //G.cromossomo_invalido.add(j,0);
                    // G.cromossomo_invalido.remove(j+1);
                 }
            }

             G.aval_cromossomo=G.aval_cromossomo +G.mapa[ind_lin-1][ind_col-1];

             if(G.mapa[ind_lin-1][ind_col-1]==0)
             {
                 G.aval_cromossomo+=G.punicao;
                 G.no_falho=1;
                 //G.cromossomo_invalido.add(j,0);
                 //G.cromossomo_invalido.remove(j+1);
             }


             }
         G.conta_cromossomo_falho+=G.no_falho;
        // G.somaAvaliacoes+= 100/G.aval_cromossomo;
          G.vet_avalicao[j]= 100/G.aval_cromossomo; 

                  }


         } 
            G.disponivel=false;
      }
    }    

// metodo main - 
    while(i<termino)
                {
            PVC.copia_pop();
                PVC.define_operador_genetico();
                Recombinacao_arestas_1 r= new Recombinacao_arestas_1();
                Recomb_arestas_2 r2= new Recomb_arestas_2();
                Avaliacao_1 a = new Avaliacao_1();

            r.start();
            r2.start();
            p.nova_pop();

            **PVC.mutacao(0.5);**
                        **a.start();**

                         PVC.calculaSomaAvaliacoes();
                PVC.controla_punicao(0.50);
                PVC.imprime();
              // PVC.punicao(0.18);


            i++;
                }
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags threads ou faça a sua própria pergunta.