1. 程式人生 > >併發集合(七)建立併發隨機數

併發集合(七)建立併發隨機數

宣告:本文是《 Java 7 Concurrency Cookbook 》的第六章,作者: Javier Fernández González     譯者:許巧輝 校對:方騰飛

建立併發隨機數

Java併發API提供指定的類在併發應用程式中生成偽隨機。它是ThreadLocalRandom類,這是Java 7版本中的新類。它使用執行緒區域性變數。每個執行緒希望以不同的生成器生成隨機數,但它們是來自相同類的管理,這對程式設計師是透明的。在這種機制下,你將獲得比使用共享的Random物件為所有執行緒生成隨機數更好的效能。

在這個指南中,你將學習如何在併發應用程式中使用ThreadLocalRandom生成隨機數。

準備工作…

這個指南的例子使用Eclipse IDE實現。如果你使用Eclipse或其他IDE,如NetBeans,開啟它並建立一個新的Java專案。

如何做…

按以下步驟來實現的這個例子:

1.建立一個TaskLocalRandom類,並指定它實現Runnable介面。

public class TaskLocalRandom implements Runnable {

2.實現這個類的構造器,通過使用current()方法給實際執行緒初始化隨機數生成器。

public TaskLocalRandom() {
ThreadLocalRandom.current();
}

3.實現run()方法。獲取執行這個任務的執行緒名稱,使用nextInt()方法寫入10個隨機整數到控制檯。

@Override
public void run() {
String name=Thread.currentThread().getName();
for (int i=0; i<10; i++){
System.out.printf("%s: %d\n",name,ThreadLocalRandom.
current().nextInt(10));
}
}

4.通過實現Main類,並新增main()方法,實現這個例子的主類。

public class Main {
public static void main(String[] args) {

5.為3個Thread物件建立一個數組。

Thread threads[]=new Thread[3];

6.建立和啟動TaskLocalRandom任務,用前面建立的陣列儲存執行緒。

for (int i=0; i<3; i++) {
TaskLocalRandom task=new TaskLocalRandom();
threads[i]=new Thread(task);
threads[i].start();
}

它是如何工作的…

TaskLocalRandom類是這個例子的關鍵。在這個類的構造器中,我們使用ThreadLocalRandom的current()方法。這是一個靜態方法,它返回當前執行緒的ThreadLocalRandom物件,你可以使用這個物件生成隨機數。如果呼叫這個方法的執行緒沒有與任何(ThreadLocalRandom)物件關聯,這個類將建立一個新的ThreadLocalRandom物件。在這種情況下,你使用這個方法初始化與任務相關的隨機數生成器,所以,在這個方法下次呼叫時,它將建立ThreadLocalRandom物件。

在TaskLocalRandom類的run()方法中,呼叫一次current()方法來生成與執行緒相關的隨機數生成器,然後,你呼叫一次nextInt()方法,並傳入數值10作為引數。這個方法將返回0到10之間的一個偽隨機數。每個任務生成10個隨機數。

不止這些…

ThreadLocalRandom類同樣提供方法來生成long、float 和 double型別的數以及 Boolean值。這些方法允許你傳入一個數值作為引數,然後生成0到這個數值之間的隨機數。還有允許你傳入兩個引數的其他方法,然後生成在這兩個引數數值之間的隨機數。

參見

  • 在第1章,執行緒管理中的使用執行緒本地變數指南