2011-08-21 15 views
10

मैं जावा 7 के ThreadLocalRandom को आजमा रहा हूं और देखता हूं कि यह कई धागे में बिल्कुल यादृच्छिक संख्याएं उत्पन्न कर रहा है।जावा 7: थ्रेडलोकलरैंडम एक ही यादृच्छिक संख्याएं उत्पन्न करता है

यहाँ मेरी कोड, जिसमें मैं 5 धागे और से 5 यादृच्छिक संख्या प्रत्येक थ्रेड प्रिंट बनाने है:

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

आउटपुट:

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, 

मैं प्रत्येक के लिए एक ही यादृच्छिक संख्या क्यों मिल रही है धागा और कार्यक्रम के हर निष्पादन के लिए?

उत्तर

10

ऐसा लगता है कि इस मुद्दे के बारे में एक खुली बग है। here देखें और here

+0

+1 निफ्टी चीजें बग – Matt

+2

बग को जेडीके 7 के अपडेट 2 में हल किया गया है। यहां डाउनलोड करें: http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u2-download-1377129.html – jopasserat

1

ऐसा इसलिए नहीं है क्योंकि धागे लगभग एक ही समय में बनाए जा रहे हैं और इस प्रकार टाइमर से समान मूल्य प्राप्त कर रहे हैं? मैं इस धारणा के तहत था कि यह कैसे काम करता था, हालांकि मैं गलत हो सकता था।

+0

यह एक ही समय नहीं है उपयोग नहीं कर सकते नहीं है, वहाँ है, लेकिन है कि निर्माता है एक बड़ा समय अंतर - प्रत्येक धागा केवल पिछले धागे को समाप्त होने के बाद ही बनाया जाता है। – MByD

5

"ThreadLocalRandom स्रोत" के लिए googling मुझे दिया http://www.assembla.com/code/scala-eclipse-toolchain/git/nodes/src/forkjoin/scala/concurrent/forkjoin/ThreadLocalRandom.java

लंबे/यह की कमी: यह एक ThreadLocal<ThreadLocalRandom> जो निर्माण

के लिए कोई आर्ग निर्माता कॉल का उपयोग करता है कोई आर्ग निर्माता है

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

एक अनूठा बीज

0 के साथ Random कॉल इस (लंबी) में कोई आर्ग सुपर

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

यानी नहीं प्रलेखन से अपेक्षित व्यवहार

और ThreadLocalRandom/निजी seed

+1

यह जेडीके स्रोत नहीं है ('ग्रहण 'और' स्कैला 'संकेतों को नोटिस करें यूआरएल)। असली जेडीके स्रोत http://hg.openjdk.java.net पर है, और यहां ['थ्रेडलोकलरैंडम'] है (http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/tip/src/ शेयर/वर्गों/जावा/util/समवर्ती/ThreadLocalRandom.java) – dimo414

संबंधित मुद्दे