Java並行ThreadLocalRandom類


java.util.concurrent.ThreadLocalRandom是從jdk 1.7開始引入的實用程式類,當需要多個執行緒或ForkJoinTasks來生成亂數時很有用。 它提高了效能,並且比Math.random()方法占用更少的資源。

ThreadLocalRandom方法

以下是ThreadLocalRandom類中可用的重要方法的列表。

編號 方法 說明
1 public static ThreadLocalRandom current() 返回當前執行緒的ThreadLocalRandom
2 protected int next(int bits) 生成下一個偽亂數。
3 public double nextDouble(double n) 返回偽隨機,均勻分布在0(含)和指定值(獨占)之間的double值。
4 public double nextDouble(double least, double bound) 返回在給定的least值(包括)和bound(不包括)之間的偽隨機均勻分布的值。
5 public int nextInt(int least, int bound) 返回在給定的least值(包括)和bound(不包括)之間的偽隨機均勻分布的整數值。
6 public long nextLong(long n) 返回偽隨機均勻分布的值在0(含)和指定值(不包括)之間的長整數值。
7 public long nextLong(long least, long bound) 返回在給定的最小值(包括)和bound(不包括)之間的偽隨機均勻分布的長整數值。
8 public void setSeed(long seed) 設定偽隨機的種子值,丟擲UnsupportedOperationException異常。

範例

以下TestThread程式演示了Lock介面的一些方法。 這裡我們使用lock()獲取鎖和unlock()來釋放鎖。

import java.util.Random;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.ThreadLocalRandom;

public class TestThread {

   public static void main(final String[] arguments) {
      System.out.println("Random Integer: " + new Random().nextInt());  
      System.out.println("Seeded Random Integer: " + new Random(15).nextInt());  
      System.out.println("Thread Local Random Integer: " + ThreadLocalRandom.current().nextInt());  
      final ThreadLocalRandom random = ThreadLocalRandom.current();  
      random.setSeed(15);  //exception will come as seeding is not allowed in ThreadLocalRandom.
      System.out.println( "Seeded Thread Local Random Integer: " + random.nextInt());  
   }
}

執行上面程式碼,將產生以下結果 -

Random Integer: 694316820
Seeded Random Integer: -1159716814
Exception in thread "main" Thread Local Random Integer: -1324834819
java.lang.UnsupportedOperationException
    at java.util.concurrent.ThreadLocalRandom.setSeed(ThreadLocalRandom.java:236)
    at com.yiibai.TestThread.main(TestThread.java:18)