天天看點

并發集合(七)建立并發随機數

建立并發随機數

java并發api提供指定的類在并發應用程式中生成僞随機。它是threadlocalrandom類,這是java 7版本中的新類。它使用線程局部變量。每個線程希望以不同的生成器生成随機數,但它們是來自相同類的管理,這對程式員是透明的。在這種機制下,你将獲得比使用共享的random對象為所有線程生成随機數更好的性能。

在這個指南中,你将學習如何在并發應用程式中使用threadlocalrandom生成随機數。

準備工作…

這個指南的例子使用eclipse ide實作。如果你使用eclipse或其他ide,如netbeans,打開它并建立一個新的java項目。

如何做…

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

1.建立一個tasklocalrandom類,并指定它實作runnable接口。

<code>1</code>

<code>public</code> <code>class</code> <code>tasklocalrandom </code><code>implements</code> <code>runnable {</code>

2.實作這個類的構造器,通過使用current()方法給實際線程初始化随機數生成器。

<code>public</code> <code>tasklocalrandom() {</code>

<code>2</code>

<code>threadlocalrandom.current();</code>

<code>3</code>

<code>}</code>

3.實作run()方法。擷取執行這個任務的線程名稱,使用nextint()方法寫入10個随機整數到控制台。

<code>@override</code>

<code>public</code> <code>void</code> <code>run() {</code>

<code>string name=thread.currentthread().getname();</code>

<code>4</code>

<code>for</code> <code>(</code><code>int</code> <code>i=</code><code>0</code><code>; i&lt;</code><code>10</code><code>; i++){</code>

<code>5</code>

<code>system.out.printf(</code><code>"%s: %d\n"</code><code>,name,threadlocalrandom.</code>

<code>6</code>

<code>current().nextint(</code><code>10</code><code>));</code>

<code>7</code>

<code>8</code>

4.通過實作main類,并添加main()方法,實作這個例子的主類。

<code>public</code> <code>class</code> <code>main {</code>

<code>public</code> <code>static</code> <code>void</code> <code>main(string[] args) {</code>

5.為3個thread對象建立一個數組。

<code>thread threads[]=</code><code>new</code> <code>thread[</code><code>3</code><code>];</code>

6.建立和啟動tasklocalrandom任務,用前面建立的數組存儲線程。

<code>for</code> <code>(</code><code>int</code> <code>i=</code><code>0</code><code>; i&lt;</code><code>3</code><code>; i++) {</code>

<code>tasklocalrandom task=</code><code>new</code> <code>tasklocalrandom();</code>

<code>threads[i]=</code><code>new</code> <code>thread(task);</code>

<code>threads[i].start();</code>

它是如何工作的…

tasklocalrandom類是這個例子的關鍵。在這個類的構造器中,我們使用threadlocalrandom的current()方法。這是一個靜态方法,它傳回目前線程的threadlocalrandom對象,你可以使用這個對象生成随機數。如果調用這個方法的線程沒有與任何(threadlocalrandom)對象關聯,這個類将建立一個新的threadlocalrandom對象。在這種情況下,你使用這個方法初始化與任務相關的随機數生成器,是以,在這個方法下次調用時,它将建立threadlocalrandom對象。

在tasklocalrandom類的run()方法中,調用一次current()方法來生成與線程相關的随機數生成器,然後,你調用一次nextint()方法,并傳入數值10作為參數。這個方法将傳回0到10之間的一個僞随機數。每個任務生成10個随機數。

不止這些…

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

參見

在第1章,線程管理中的使用線程本地變量指南