创建并发随机数
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<</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<</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章,线程管理中的使用线程本地变量指南