2011-08-21 19 views
10

Java 7'nin ThreadLocalRandom sürümünü deniyorum ve birden çok ileti dizisinde tam olarak aynı rastgele sayıları oluşturduğunu görüyorum. İşte Java 7: ThreadLocalRandom aynı rasgele sayıları üretiyor

Ben 5 rastgele sayılar üzerinden 5 konuları ve her iş parçacığı baskılar oluşturmak ettiği kodumu vardır:

//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(); 
} 

Çıktı:

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, 

Neden her biri için aynı rasgele sayılar alıyorum iş parçacığı ve programın her yürütme için?

cevap

10

Bu sorunla ilgili açık bir hata var gibi görünüyor. "ThreadLocalRandom kaynağı" googling Bkz here ve here

+0

+1 Nifty şeyler hata – Matt

+2

Bu hata, JDK7'nin 2. Güncellemesi'nde çözüldü. Buradan indirin: http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u2-download-1377129.html – jopasserat

1

Bu, iş parçacıklarının kabaca aynı anda oluşturulduğu ve bu nedenle zamanlayıcıdan aynı değere sahip olduğu için değil mi? Yanılmış olabilsem de bunun nasıl işe yaradığı izlenimindeydim.

+0

kullanamaz gelmez, büyük bir dokümantasyon beklenen davranış yoktur değil yani o kurucu gelmez ANCAK Zaman farkı - Her iplik sadece önceki iş parçacığı sonlandırıldıktan sonra oluşturulur. – MByD

5

http://www.assembla.com/code/scala-eclipse-toolchain/git/nodes/src/forkjoin/scala/concurrent/forkjoin/ThreadLocalRandom.java

uzun/lafın kısası bana verdi: yapım

no-arg yapıcı çağıran bir ThreadLocal<ThreadLocalRandom> kullandığı no-arg yapıcı

/** 
* 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(); 
} 

benzersiz bir tohum

0 ile Random aramalar bu (uzun) hiçbir-arg süper

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

ve ThreadLocalRandom/Aynı zaman değil özel seed

+1

JDK kaynağı bu değil ("eclipse" ve "scala" ipuçlarına dikkat edin URL). Gerçek JDK kaynağı http://hg.openjdk.java.net adresindedir ve işte burada ['ThreadLocalRandom'] (http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/tip/src/ share/sınıfları/java/util/eşzamanlı/ThreadLocalRandom.java) – dimo414