2011-08-22 16 views
6

Necesito definir una variable compartida en el método main() de mi clase Principal. Necesito dos hilos para poder acceder a esa variable compartida. Estoy creando los hilos implementando la interfaz Runnable e implementando el método abstract run() de la interfaz. ¿Cómo me refiero a la variable compartida definida en el método main() de la clase Main desde el método run() definido en mi clase que implementa la interfaz Runnable? Obviamente, simplemente llamarlos por su nombre no funciona, ya que parecen estar fuera del alcance de mi clase Runnable.accediendo a la variable compartida desde dentro de una clase Ejecutable

EDITAR - disculpas, aquí es un ejemplo sencillo

public Class DoThread implements Runnable { 

    public void run(){ 
     sharedVar += 1 
    } 


} 

y en un archivo .class separados:

public Class Main { 

    public static void main(String[] args) { 
     int sharedVar = 0; 

     Thread t1 = new Thread(new DoThread()); 
     Thread t2 = new Thread(new DoThread()); 

     t1.start(); 
     t2.start(); 

     t1.join(); 
     t2.join(); 

    } 


} 

Así que debo estar creando un objeto para almacenar el var compartido y luego pasando ese objeto a ambos constructores DoThread() al crear los hilos? A veces me confundo cuando java pasa por ref o pasa por var, de modo que si lo hago de esta manera, t2 verá los cambios a la var compartida por t1?

+0

¿Podría publicar su código? – SJuan76

+0

Siempre intenta publicar un [SSCCE] (http://sscce.org/). –

Respuesta

10

Bueno, si declara una variable local , no podrá referirse a eso en ningún otro lugar que no sea en clases creadas con ese método.

¿Dónde está implementando Runnable? Si está en la misma clase, puede convertirla en una variable de instancia y hacer que main establezca la variable en la misma instancia desde la que está creando el hilo o convertirla en una variable estática. Si Runnable se implementa en una clase diferente, cuando construya una instancia de esa clase podría proporcionarle los datos que necesita, no está claro exactamente qué significa eso en este punto ... Como otros han dicho, el código sería útil. (Por ejemplo, ¿los hilos deben poder ver los cambios en los datos originales?)

Como un lado, el enhebrado es relativamente avanzado, mientras que la propagación de datos entre las clases es relativamente básica. Si eres nuevo en Java, te recomendaría empezar por cosas más sencillas que el enhebrado.

EDIT: Para su ejemplo, se debe utilizar un AtomicInteger, así:

import java.util.concurrent.atomic.AtomicInteger; 

class DoThread implements Runnable { 

    private final AtomicInteger counter; 

    DoThread(AtomicInteger counter) { 
     this.counter = counter; 
    } 

    public void run() { 
     counter.incrementAndGet(); 
    } 
} 

public class Test { 
    public static void main(String[] args) throws InterruptedException { 
     AtomicInteger shared = new AtomicInteger(0); 

     Thread t1 = new Thread(new DoThread(shared)); 
     Thread t2 = new Thread(new DoThread(shared)); 

     t1.start(); 
     t2.start(); 

     t1.join(); 
     t2.join(); 

     System.out.println(shared.get()); // Prints 2 
    } 
} 
+0

gracias jon - agregué un ejemplo en la publicación original^ –

+0

@Dave: He dado un ejemplo de cómo puedes cambiar tu código. Sigo pensando que si compartir datos entre diferentes objetos es relativamente nuevo para ti, probablemente aún no estés preparado para las dificultades adicionales de enhebrar. –

7

El código sería útil.

Si está utilizando una clase anónima, puede declarar las variables como final y se podrá acceder a ellas en la clase anónima.

public void main(String[] args) { 
    final int myvar = 0; 
    new Thread(new Runnable() { 
     public void run() { 
      System.out.println("myvar: "+myvar); 
     } 
    }).start(); 
} 
2

Debe pasar una referencia al valor compartido. Si ya no es una referencia, debe cambiarlo a AtomicReference, AtomicInt, etc. o a una matriz del valor que desea compartir.

0

Este es el lugar donde passByRef es más eficaz. Pase su referencia de variable a ambas instancias ejecutables. Eso es todo ... a partir de entonces se puede hacer referencia dentro de su método de ejecución.

Ex:

Tema Th1 = new Thread (Myrunnable (Ref.var)). Del mismo modo para otro hilo

+0

es lo que he mencionado en mi edición, ¿es esto así? –

Cuestiones relacionadas