Buenas, me estoy preparando la certificación SCJP de java
y viendo un ejemplo de hilos me ha surgido una duda.
Teniendo el siguiente código:
Código Java:
Ver original Calculator c;
public Reader(Calculator calc
) { c = calc;
}
public void run() {
synchronized (c) {
try {
System.
out.
println("Waiting for calculation..."); c.wait();
}
System.
out.
println("Total is: " + c.
total); }
}
public static void main
(String[] args
) { Calculator calculator = new Calculator();
new Reader(calculator
).
start(); new Reader(calculator
).
start(); new Reader(calculator
).
start(); calculator.start();
}
}
class Calculator
extends Thread { 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??