2011-01-14 9 views
6

Volevo stampare 100 come output nel programma seguente.Cosa fare per stampare 100?

Sto ricevendo 0 come risposta.

class s extends Thread{ 
    int j=0; 
     public void run() { 
      try{Thread.sleep(5000);} 
      catch(Exception e){} 
      j=100; 
     } 
     public static void main(String args[]) 
     { 
      s t1=new s(); 
      t1.start(); 
      System.out.println(t1.j); 
     } 

} 
+0

Inoltre, e correggimi se sono guru sbagliato, piuttosto di accedere direttamente alla variabile "s" della classe, dovresti includere un metodo accessor per stampare il valore di j. –

+0

@The Ox: sarebbe una buona pratica. Più importante qui è sincronizzare l'accesso a 'j' (o dichiararlo' volatile'). È possibile (anche se improbabile) che il thread principale possa vedere un valore di 'j' stante anche dopo che il thread' s' ha finito di scriverlo. Vedi il libro di Brian Goetz "Java Concurrency in Practice" per una buona spiegazione del perché questo è vero. –

risposta

5

È necessario unire il T1 al principale. Quindi, il genitore thread(main()) attenderà fino al completamento del thread secondario.

13

, è necessario attendere che il Thread a finish..I hanno aggiunto una chiamata a join per voi, che bloccherà e attendere che il Thread per completare prima di guardare il valore di j:

class s extends Thread{ 
    int j=0; 
    public void run() { 
     try{ Thread.sleep(5000); } catch(Exception e){} 
     j = 100; 
    } 

    public static void main(String args[]) throws InterruptedException { 
     s t1=new s(); 
     t1.start(); 
     t1.join() ; // Wait for t1 to finish 
     System.out.println(t1.j); 
    } 
} 
+1

+1 Oppure, crea un blocco sincronizzato sul metodo run()! ~ –

+0

Cosa cambierà un blocco sincronizzato? – gabuzo

+0

È davvero necessario sincronizzare l'accesso a 'j', o dichiararlo' volatile'. È possibile ottenere una lettura stante anche su tipi primitivi. Brian Goetz può spiegare perché meglio di me. Ancora, +1 per dare l'OP l'idea giusta. –

2

registrazione t1

t1.join 

in modo che il thread principale attende

2

Basta aderire al t1 filo al principale

t1.join