2011-08-21 61 views
10

Tôi đang thử Java 7's ThreadLocalRandom và thấy rằng nó đang tạo ra chính xác cùng một số ngẫu nhiên trên nhiều chủ đề.Java 7: ThreadLocalRandom tạo cùng một số ngẫu nhiên

Đây là mã của tôi, trong đó tôi tạo ra 5 chủ đề và mỗi thread in ra 5 số ngẫu nhiên:

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

Output:

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, 

Tại sao tôi nhận những con số ngẫu nhiên tương tự cho mỗi và cho mỗi lần thực hiện chương trình?

Trả lời

10

Dường như có lỗi mở về vấn đề này. Xem herehere

+0

+1 Nifty lỗi là – Matt

+2

Lỗi đã được giải quyết trong Bản cập nhật 2 của JDK7. Tải xuống tại đây: http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u2-download-1377129.html – jopasserat

1

Đây không phải là vì các chủ đề đang được tạo ra ở gần cùng một thời điểm và do đó nhận được hạt giống cùng một giá trị từ bộ đếm thời gian? Tôi đã có ấn tượng rằng nó đã hoạt động như thế nào, mặc dù tôi có thể bị nhầm lẫn.

+0

Nó không phải cùng một lúc, có một lớn chênh lệch thời gian - mỗi chuỗi chỉ được tạo sau khi chuỗi trước đã bị chấm dứt. – MByD

5

googling cho "nguồn ThreadLocalRandom" đã cho tôi http://www.assembla.com/code/scala-eclipse-toolchain/git/nodes/src/forkjoin/scala/concurrent/forkjoin/ThreadLocalRandom.java

dài/ngắn của nó: nó sử dụng một ThreadLocal<ThreadLocalRandom> mà gọi là không-arg constructor để xây dựng

rằng không-arg constructor là

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

siêu không-arg trong Random cuộc gọi này (dài) với một hạt giống độc đáo

TUY NHIÊN constructor mà

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

tức là không phải là hành vi mong đợi từ tài liệu

và ThreadLocalRandom không/không thể sử dụng tin seed

+1

Đó không phải là nguồn JDK (lưu ý các gợi ý 'eclipse' và' scala' trong URL). Nguồn JDK thực có tại http://hg.openjdk.java.net, và đây là ['ThreadLocalRandom'] (http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/tip/src/ chia sẻ/lớp/java/util/concurrent/ThreadLocalRandom.java) – dimo414