Pessoal, poderiam me tirar uma dúvida.
Qual o problema do meu código? A questão é bem simples, um algoritmo pra intercalar entre as threads, no caso a t1 e t2
pra ficar escrevendo Outono - verao - outono - verao e por aí vai.
O problema é que as duas threads estão disputando o campo “set”. Você quer sincronizar as duas não é? Essa não é a melhor forma de fazer isso. Vou mexer no teu código… Já volto.
Fabio_Borecki
então, mas é q eu deixo esse while pra segurar a thread e só liberar o comando quando for a hora certa pra alternar entre elas… é uma questão da faculdade, aparentemente todos os alunos conseguem dessa forma menos eu, to começando a achar q é alguma coisa do meu pc, pq tá foda… vc poderia testar meu codigo no seu eclipse pra ver se ele empaca igual aqui ou flui normalmente?
davidbuzatto
Não é coisa do seu PC. Computação é determinística, não existe esse tipo de coisa psicológica que “lá funciona” e “aqui não funciona”.
Sinceramente, seu exemplo está bem enrolado, pq vc está fazendo tudo dentro de uma mesma classe, misturando as coisas. Vou te passar um exemplo clássico de produtor/consumidor, vc poderá adaptar para sua necessidade.
/** * * @author Prof. Dr. David Buzatto */publicclassDeposito{privateStringmensagem;privatebooleanvazio=true;publicsynchronizedStringobter(){// aguarda até a mensagem estar disponívelwhile(vazio){try{wait();}catch(InterruptedExceptionexc){exc.printStackTrace();}}vazio=true;// notifica quem está esperandonotifyAll();returnmensagem;}publicsynchronizedvoidinserir(Stringmensagem){// aguarda até a mensagem ser recuperadawhile(!vazio){try{wait();}catch(InterruptedExceptionexc){exc.printStackTrace();}}vazio=false;this.mensagem=mensagem;// notifica quem está esperandonotifyAll();}}importjava.util.Random;/** * * @author Prof. Dr. David Buzatto */publicclassProdutorimplementsRunnable{privateDepositodeposito;publicProdutor(Depositodeposito){this.deposito=deposito;}@Overridepublicvoidrun(){String[]mensagens={"um","dois","três","quatro"};Randomr=newRandom();for(inti=0;i<mensagens.length;i++){deposito.inserir(mensagens[i]);try{Thread.sleep(r.nextInt(5000));}catch(InterruptedExceptionexc){exc.printStackTrace();}}deposito.inserir("pronto");}}importjava.util.Random;/** * * @author Prof. Dr. David Buzatto */publicclassConsumidorimplementsRunnable{privateDepositodeposito;publicConsumidor(Depositodeposito){this.deposito=deposito;}@Overridepublicvoidrun(){Randomr=newRandom();for(Stringmensagem=deposito.obter();!mensagem.equals("pronto");mensagem=deposito.obter()){System.out.printf("mensagem recebida: %s\n",mensagem);try{Thread.sleep(r.nextInt(5000));}catch(InterruptedExceptionexc){exc.printStackTrace();}}}}/** * Sincronização de execução entre duas threads usando wait e notifyAll * * @author Prof. Dr. David Buzatto */publicclassTesteProdutorConsumidor{publicstaticvoidmain(String[]args){Depositodeposito=newDeposito();newThread(newProdutor(deposito)).start();newThread(newConsumidor(deposito)).start();}}
Fabio_Borecki
sim kkk, sei q não é, modo de falar, pq parece q só comigo q deu problema hahahah
obrigado desde já
davidbuzatto
Dá uma olhada Fábio, postei acima.
Seja bem-vindo ao GUJ