Ola alguem sabe me dize pq nao consigo garantir esta soma sempre que mando executar o threads?
class Ptrheads implements Runnable{
static int a;
public void run() {
a++;
}
}
class NewClass{
public static void main(String...a){
Ptrheads p=new Ptrheads();
Ptrheads p2=new Ptrheads();
Thread t=new Thread(p);
Thread t2=new Thread(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.
t.start();
t2.start();
t.join(); //Espera t terminar
t2.join(); //Espera t2 terminar
System.out.println(" Variavel "+Ptrheads.a); //Vai imprimir sempre 2
}
[/code]
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.
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!
[quote=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![/quote]
Documentação é sua amiga, leia-a.
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.