Como garantir um resultado

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.

Você pode tentar assim:

[code]public static void main(String…a){
Ptrheads p=new Ptrheads();
Ptrheads p2=new Ptrheads();
Thread t=new Thread§;
Thread t2=new Thread(p2);

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.

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 !!

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.

Até!

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.

Para mais informações sobre Future e Callables, veja esse link: http://www.guj.com.br/posts/list/50321.java#264620