Teniendo el siguiente código:
Código Java:
Ver original
Calculator c; c = calc; } public void run() { synchronized (c) { try { c.wait(); } } } Calculator calculator = new Calculator(); calculator.start(); } } int total; public void run() { synchronized (this) { for (int i = 0; i < 100; i++) { total += i; } notifyAll(); } } }
Pensaba en un principio que la salida era:
Waiting for calculation...
Waiting for calculation...
Waiting for calculation...
Total is: 4950
Total is: 4950
Total is: 4950
Porque se crean los 3 hilos de la clase Reader y se ponen en espera, y luego se crea el hilo de la clase Calculator y se hace el notifyall() que los libera...
Pero para mi sorpresa, no siempre se da ese resultado, ya que por lo visto los hilos se ejecutan en un orden aleatorio en función de lo que decida la JVM.
Existe alguna forma, de controlar el orden en la que se ejecutan los hilos en la JVM? Si por ejemplo quiero que se ejecute el hilo
calculator.start();
en último lugar siempre, que debería añadir al código?
He estado haciendo pruebas, pense en ponerle un booleano y comprobar desde el run() de calculator que todos los hilos Reader estuviesen ejecutandose, pero esto no me sirve si la JVM ejecuta en un orden aleatorio.
El método yield(), se utiliza para asignar prioridades pero en este caso como debería utilirse??