2011-08-21 21 views
10

Estoy probando Java 7's ThreadLocalRandom y veo que está generando exactamente los mismos números aleatorios en varios hilos.Java 7: ThreadLocalRandom que genera los mismos números aleatorios

Aquí está mi código, en el que se crea 5 hilos y que imprime cada hilo de cada 5 números aleatorios:

//5 threads 
for(int i = 0; i < 5 ; i++) { 
    final Thread thread = new Thread() { 
     @Override 
     public void run() { 
      System.out.print(Thread.currentThread().getName()+":"); 

      //each thread prints 5 random numbers 
      for(int j = 0 ; j < 5; j++) { 
       final int random = ThreadLocalRandom.current().nextInt(1,100); 
       System.out.print(random + ","); 
      } 
      System.out.println(); 
     } 
    }; 
    thread.start(); 
    thread.join(); 
} 

Salida:

Thread-0:1,93,45,75,29, 
Thread-1:1,93,45,75,29, 
Thread-2:1,93,45,75,29, 
Thread-3:1,93,45,75,29, 
Thread-4:1,93,45,75,29, 

¿Por qué recibo los mismos números aleatorios para cada hilo y para cada ejecución del programa?

Respuesta

10

Parece que hay un error abierto con respecto a este problema. Ver here y here

+0

+1 Nifty cosas errores son – Matt

+2

El error se ha resuelto en la actualización 2 de JDK7. Descargue aquí: http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u2-download-1377129.html – jopasserat

1

¿No es esto porque los hilos se están creando más o menos al mismo tiempo y, por lo tanto, obteniendo el mismo valor del temporizador? Tenía la impresión de que así era como funcionaba, aunque puedo estar equivocado.

+0

No es al mismo tiempo, hay una gran diferencia de tiempo: cada hilo se crea solo después de que se finalizó el hilo anterior. – MByD

5

google para la "fuente ThreadLocalRandom" me dio http://www.assembla.com/code/scala-eclipse-toolchain/git/nodes/src/forkjoin/scala/concurrent/forkjoin/ThreadLocalRandom.java

largo/corto de él: se utiliza un ThreadLocal<ThreadLocalRandom> que llama a la no-arg constructor para la construcción

que sin argumentos del constructor es

/** 
* Constructor called only by localRandom.initialValue. 
* We rely on the fact that the superclass no-arg constructor 
* invokes setSeed exactly once to initialize. 
*/ 
ThreadLocalRandom() { 
    super(); 
} 

los súper sin argumentos en llamadas Random este (largo) con una única semilla

sin embargo, que el constructor qué

public Random(long seed) { 
    this.seed = new AtomicLong(initialScramble(seed)); 
} 

es decir, no el comportamiento esperado de la documentación

y ThreadLocalRandom no/no se puede utilizar la privada seed

+1

Esa no es la fuente JDK (fíjese en las sugerencias 'eclipse' y' scala' en la URL). La fuente real de JDK está en http://hg.openjdk.java.net, y aquí está ['ThreadLocalRandom'] (http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/tip/src/ compartir/classes/java/util/concurrent/ThreadLocalRandom.java) – dimo414