2010-08-31 16 views
9

Soy nuevo en Java y asisto a un curso de Programación simultánea. Estoy tratando desesperadamente de obtener un ejemplo de trabajo mínimo que pueda ayudar a demostrar los conceptos que he aprendido, como usar la palabra clave 'sincronizada' y compartir un objeto a través de los hilos. He estado buscando, pero no pude obtener un marco básico. Programadores de Java, amablemente ayuda.Compartir un objeto entre dos hilos y el programa principal

Respuesta

4

Aquí hay un ejemplo de cómo compartir una matriz entre dos hilos. Por lo general, verás todos los ceros, pero a veces las cosas se ponen complicadas y ves otros números.

final int[] arr = new int[100]; 
Thread one = new Thread() { 
    public void run() { 
     // synchronized (arr) { 
      for (int i = 0; i < arr.length * 100000; i++) { 
       arr[i % arr.length]--; 
      } 
     // } 
    } 
}; 
Thread two = new Thread() { 
    public void run() { 
     // synchronized (arr) { 
      for (int i = 0; i < arr.length * 100000; i++) { 
       arr[i % arr.length]++; 
      } 
     //} 
    } 
}; 
one.start(); 
two.start(); 
one.join(); 
two.join(); 
for (int i = 0; i < arr.length; i++) { 
    System.out.println(arr[i]); 
} 

Pero, si sincroniza en arr alrededor del bucle siempre verá todos 0 s en la copia impresa. Si descomenta el bloque sincronizado, el código se ejecutará sin error.

+2

También puede deshacerse de los errores sincronizando en 'arr' solo las líneas de incremento y decremento: http://pastebin.com/vN4E527P Esto subraya el hecho de que las únicas partes inseguras de hilo son esas dos líneas. –

+0

A veces obtengo una cadena de números aleatorios. Estoy confundido. ¿Puedes explicar amablemente el trabajo? – devnull

+0

No debería arr [i% arr.length] - y arr [i% arr.length] ++ balancearse ya que se está ejecutando la misma cantidad de veces? En otras palabras, ¿no debería el resultado ser cero siempre? – devnull

7

Un ejemplo simple. Espero que te guste el fútbol (o fútbol). :)

public class Game { 

public static void main(String[] args) { 
    Ball gameBall = new Ball(); 
    Runnable playerOne = new Player("Pasha", gameBall); 
    Runnable playerTwo = new Player("Maxi", gameBall); 

    new Thread(playerOne).start(); 
    new Thread(playerTwo).start(); 
} 

} 

public class Player implements Runnable { 

private final String name; 
private final Ball ball; 

public Player(String aName, Ball aBall) { 
    name = aName; 
    ball = aBall; 
} 

@Override 
public void run() { 
    while(true) { 
    ball.kick(name); 
    } 
} 

} 

public class Ball { 

private String log; 

public Ball() { 
    log = ""; 
} 

//Removing the synchronized keyword will cause a race condition. 
public synchronized void kick(String aPlayerName) { 
    log += aPlayerName + " "; 
} 

public String getLog() { 
    return log; 
} 

} 
+1

¿Cómo muestra esto una condición de carrera? – jjnguy

+0

Crea una instancia de algunos objetos más de Player para hacerlo más obvio. – Mike

+0

Por lo que puedo ver, alternará entre los nombres de los jugadores. Pero no necesariamente todos los demás, porque así es como funciona el cambio de contexto. – jjnguy

Cuestiones relacionadas