Ola alguem sabe me dize pq nao consigo garantir esta soma sempre que mando executar o threads?
classPtrheadsimplementsRunnable{staticinta;publicvoidrun(){a++;}}classNewClass{publicstaticvoidmain(String...a){Ptrheadsp=newPtrheads();Ptrheadsp2=newPtrheads();Threadt=newThread(p);Threadt2=newThread(p2);t.start();t2.start();System.out.println(" Variavel "+Ptrheads.a);//as vezes é zero as vezes é um?pq??}}
Pq as vezes o seu println roda antes das threads iniciarem a execução. E as vezes roda depois da primeira thread iniciar a execução. Pode também acontecer dele imprimir dois, se você rodar várias vezes.
Você nunca sabe a ordem que as threads irão executar.
Você pode tentar assim:
publicstaticvoidmain(String...a){Ptrheadsp=newPtrheads();Ptrheadsp2=newPtrheads();Threadt=newThread(p);Threadt2=newThread(p2);t.start();t2.start();t.join();//Espera t terminart2.join();//Espera t2 terminarSystem.out.println(" Variavel "+Ptrheads.a);//Vai imprimir sempre 2}
Para ter certeza do resultado, declare a variável a como volatile, já que ela é acessada por várias threads simultaneamente.
É impossível prever a ordem que threads irão executar. Quem define isso é o sistema operacional. Para ter garantias, você deve usar algum mecanismo de sincronização, como o join, futures e callables, ou até mesmo blocos com wait e notify.
F
fabioEM
Obrigado Vinny e aproveito para te mandar um bom ano novo para vc e a todo a galera que sempre ta ligada aqui aqui no guj !!
F
fabioEM
So mais uma duvida ,tu sabes a diferenca de sleep para join pois ao usar sleep tambem consigo parar o trheads por 1000 segundos mas
nao entendi a diferenca entao com o join!
maquiavelbona
fabioEM:
So mais uma duvida ,tu sabes a diferenca de sleep para join pois ao usar sleep tambem consigo parar o trheads por 1000 segundos mas
nao entendi a diferenca entao com o join!
O join() espera uma thread parar.
O sleep faz uma thread ser agendada para daqui a n millisegundos.
São coisas completamente diferentes, não?
Se a thread que você espera que dure n millis durar n+1 ou mais millis, e você depender do resultado dela, você certamente terá um problema.
Use o sleep para dar uma pausa, um wait associado a um while para esperar por uma condição, o join() para esperar o término de outra thread, e Futures e Callables para aguardar um resultado vindo de uma computação realizada em outra thread.