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
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.
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;
}
}
¿Cómo muestra esto una condición de carrera? – jjnguy
Crea una instancia de algunos objetos más de Player para hacerlo más obvio. – Mike
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
- 1. Compartir objetos entre un BackgroundWorker y el hilo principal
- 2. ¿Es posible compartir un objeto opengl framebuffer entre contextos/hilos?
- 3. Compartir un objeto entre actividades
- 4. NSPrivateQueueConcurrencyType de Datos Básicos y compartir objetos entre hilos
- 5. cómo compartir una transacción entre varios hilos
- 6. Comunicación entre dos hilos
- 7. SQLite: Compartir conexiones entre hilos para leer y escribir
- 8. Compartir un JavaVM * entre hilos en Android NDK
- 9. Enhebrado, comunicación entre dos hilos C#
- 10. Cómo compartir datos entre diferentes hilos En C# usando AOP?
- 11. ¿Cómo compartir una variable entre dos clases?
- 12. Compartir una cookie entre dos sitios web
- 13. Compartir datos de iCloud entre dos aplicaciones
- 14. compartir datos entre dos aplicaciones de iphone
- 15. Java comparte una variable entre dos hilos
- 16. ¿Compartir una conexión db entre hilos en una aplicación C#?
- 17. Diferencia entre el objeto y el objeto
- 18. ¿Compartir el conjunto de datos entre el informe principal y los subinformes en Crystal Reports 2008?
- 19. ¿Cómo debo manejar la comunicación entre los hilos AI y el lazo principal del juego?
- 20. ¿Compartir un objeto complejo entre procesos de Python?
- 21. Hilo de proceso VS: ¿dos procesos pueden compartir la misma memoria compartida? ¿Pueden dos hilos?
- 22. ¿Diferencia entre un script y un programa?
- 23. Compartir búfer binario entre el servidor Node.js y el navegador
- 24. ¿Cómo puedo compartir una variable u objeto entre dos o más servlets?
- 25. ¿Diferencia entre un objeto y un hash?
- 26. hacer que el programa principal espere a que terminen los hilos
- 27. Compartir código entre dos proyectos de git diferentes
- 28. compartir una base de datos entre el trenzado y Django
- 29. Compartir una sesión entre Ruby y PHP
- 30. Compartir matriz entre lua y C
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. –
A veces obtengo una cadena de números aleatorios. Estoy confundido. ¿Puedes explicar amablemente el trabajo? – devnull
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