2011-01-14 12 views
6

Quería imprimir 100 como salida en el siguiente programa.¿Qué hacer para imprimir 100?

Obtengo 0 como respuesta.

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

también, y me corrija si estoy equivocado gurús, en vez que acceder directamente a la variable de la "clase s", debe incluir un método de acceso para imprimir el valor de j. –

+0

@The Ox: Esa sería una buena práctica. Más importante aquí es sincronizar el acceso a 'j' (o declararlo' volátil'). Es posible (aunque poco probable) que el hilo principal pueda ver un valor obsoleto de 'j' incluso después de que la hebra' s' haya terminado de escribir en él. Consulte el libro de Brian Goetz "Concurrencia de Java en la práctica" para obtener una buena explicación de por qué esto es cierto. –

Respuesta

5

Tiene unir la t1 a la principal. Entonces, el padre thread(main()) esperará hasta que se complete el subproceso secundario.

13

Es necesario esperar a que el Thread a finish..I han añadido una llamada a join para usted, que bloqueará y esperar a que el Thread para completar antes de mirar el valor de 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 O, haga un bloque sincronizado en el método run()! ~ –

+0

¿Qué cambiará un bloque sincronizado? – gabuzo

+0

Realmente necesita sincronizar el acceso a 'j', o declararlo' volátil'. Es posible obtener una lectura obsoleta incluso en tipos primitivos. Brian Goetz puede explicar por qué mejor que yo. Aún así, +1 por darle al OP la idea correcta. –

2

Ingreso t1

t1.join 

de manera que el hilo principal esperará

2

simplemente se unen al hilo de t1 a principal

t1.join 
Cuestiones relacionadas