Ver Mensaje Individual
  #1 (permalink)  
Antiguo 02/04/2014, 03:43
Avatar de rgf1987
rgf1987
 
Fecha de Ingreso: diciembre-2012
Ubicación: Asturias
Mensajes: 269
Antigüedad: 12 años
Puntos: 22
Duda Ejecución Hilos

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
  1. class Reader extends Thread {
  2.     Calculator c;
  3.  
  4.     public Reader(Calculator calc) {
  5.         c = calc;
  6.     }
  7.  
  8.     public void run() {
  9.         synchronized (c) {
  10.             try {
  11.                 System.out.println("Waiting for calculation...");
  12.                 c.wait();
  13.             } catch (InterruptedException e) {
  14.             }
  15.             System.out.println("Total is: " + c.total);
  16.         }
  17.     }
  18.  
  19.     public static void main(String[] args) {
  20.         Calculator calculator = new Calculator();
  21.         new Reader(calculator).start();
  22.         new Reader(calculator).start();
  23.         new Reader(calculator).start();
  24.         calculator.start();
  25.     }
  26. }
  27.  
  28. class Calculator extends Thread {
  29.     int total;
  30.  
  31.     public void run() {
  32.         synchronized (this) {
  33.             for (int i = 0; i < 100; i++) {
  34.                 total += i;
  35.             }
  36.             notifyAll();
  37.         }
  38.     }
  39. }

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??