PDA

Ver la Versión Completa : Orden de secuencia incorrecto


AngelV
12-09-2007, 21:17:51
Hola!

Como puse en otro mensaje ando liado con Programación Concurrente. Procuré ayudarme del libro Piensa en Java de Bruce Eckel.

En el Capítulo 14 de la Segunda Edición, se tratan los Hilos múltiples, pues bien, estoy probando los ejemplos sencillitos, para ver que se intercalan hilos, y no es todo secuencial.

Os pongo el código del pequeño ejemplo:


public class SimpleThread extends Thread
{

private int countDown = 5;
private static int threadCount = 0;
private int threadNumber = ++threadCount;

public SimpleThread()
{
System.out.println("Making " + threadNumber);
}

public void run()
{
while(true)
{
System.out.println("Thread " + threadNumber + "(" + countDown + ")");
if(--countDown == 0)
return;
}
}

public static void main(String[] args)
{
for(int i = 0; i < 5; i++)
new SimpleThread().start();
System.out.println("All Threads Started");
}

}


Es de lo más sencillo que hay, y no trata con semáforos, ni monitores ni nada, simplemente hilos, y ver que se intercalan. Pues bueno, tanto con Eclipse, como desde consola:


javac SimpleThread.java
java SimpleThread


el resultado que me da siempre es el mismo:

Making 1
Making 2
Thread 1(5)
Thread 1(4)
Thread 1(3)
Thread 1(2)
Thread 1(1)
Making 3
Thread 2(5)
Thread 2(4)
Thread 2(3)
Thread 2(2)
Thread 2(1)
Making 4
Thread 3(5)
Thread 3(4)
Thread 3(3)
Thread 3(2)
Thread 3(1)
Making 5
Thread 4(5)
Thread 4(4)
Thread 4(3)
Thread 4(2)
Thread 4(1)
All Threads Started
Thread 5(5)
Thread 5(4)
Thread 5(3)
Thread 5(2)
Thread 5(1)


Hay algo aquí que está fallando, y no se qué puede ser. Espero que alguien haya podido tener el mismo fallo que yo anteriormente, y me pueda aconsejar.

// Saludos


Todo esto lo estoy haciendo en Kubuntu 7.04 Feisty Fawn con el JRE 6 instalado.

Arcioneo
12-09-2007, 23:51:46
Te parece secuencial porque el ciclo es tan corto que el procesador no tiene que realizar interrupciones entre hilos, aumenta los ciclos de tus contadores a numero mucho mayor y verás como los empieza a intercalar:D

AngelV
13-09-2007, 01:01:17
Te parece secuencial porque el ciclo es tan corto que el procesador no tiene que realizar interrupciones entre hilos, aumenta los ciclos de tus contadores a numero mucho mayor y verás como los empieza a intercalar:D

Resulta que llevaba usted razón, señor. Toda la tarde angustiado pensando si habrían modificado la forma de funcionar de los últimos JRE, a ver si tenía desconfigurado Java, a ver si habían modificado los hilos desde la versión de Java 2 (que es la que describe el libro) hasta la 6, o si es que directamente yo soy gilipollas y todo me sale mal :D .

Pero si que debe ser pequeño el ciclo, después le puse 50 para probar, y también me salía secuencial.Me mosqueé y puse 500, ya empezó, aunque poco a intercalar. Con 5.000 seguía intercalando poco, pero ya con 50.000 fue otro cantar. Ahora lo tengo trabajando que puse directamente 5,000.000 de decrementos por hilo, y parece que está tardando :p

Muchas gracias por todo, Arcioneo. ;)

Arcioneo
13-09-2007, 10:49:04
Resulta que llevaba usted razón, señor. Toda la tarde angustiado pensando si habrían modificado la forma de funcionar de los últimos JRE, a ver si tenía desconfigurado Java, a ver si habían modificado los hilos desde la versión de Java 2 (que es la que describe el libro) hasta la 6, o si es que directamente yo soy gilipollas y todo me sale mal :D .

Pero si que debe ser pequeño el ciclo, después le puse 50 para probar, y también me salía secuencial.Me mosqueé y puse 500, ya empezó, aunque poco a intercalar. Con 5.000 seguía intercalando poco, pero ya con 50.000 fue otro cantar. Ahora lo tengo trabajando que puse directamente 5,000.000 de decrementos por hilo, y parece que está tardando :p

Muchas gracias por todo, Arcioneo. ;)


Pero en tu vida vuelvas a decirme SEÑOR:mad::mad::mad:

AngelV
13-09-2007, 15:06:02
Pero en tu vida vuelvas a decirme SEÑOR:mad::mad::mad:
Eso está hecho, señor :D