ThreadLocalRandom类在Java版本7中引入,是Java并发API提供的特定类,在并发应用中生成伪随机数。此类作为线程的局部变量使用,每个要生成随机数的线程都有不同的生成器,但是它们都是通过此类以透明的方式管理给程序员。使用这种机制,性能要比使用共享Random对象生成所有线程的随机数更好。
本节将学习如何使用ThreadLocalRandom类在并发应用中生成随机数。
准备工作
本范例通过Eclipse开发工具实现。如果使用诸如NetBeans的开发工具,打开并创建一个新的Java项目。
实现过程
通过如下步骤实现范例:
-
创建名为TaskLocalRandom的类,指定其实现Runnable接口:
public class TaskLocalRandom implements Runnable {
-
实现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)); } } }
-
实现本范例主类,创建名为Main的类,包含main()方法:
public class Main { public static void main(String[] args) {
-
创建三个Thread对象的数组:
Thread threads[]=new Thread[3];
-
创建加载三个TaskLocalRandom任务,将线程存储到之前创建的数组中:
for (int i=0; i<3; i++) { TaskLocalRandom task=new TaskLocalRandom(); threads[i]=new Thread(task); threads[i].start(); } } }
工作原理
本范例的关键是在TaskLocalRandom类中。此类构造函数中,调用了TaskLocalRandom类的current()方法。这是一个静态方法,返回与当前线程关联的ThreadLocalRandom对象,因此可以使用此对象生成随机数。如果调用此方法的线程没有任何关联对象,此类将创建一个新的对象。在本例中,使用此方法初始化与此任务相关联的随机生成器,因此它将在下一次调用此方法中创建。
在TaskLocalRandom类的run()方法中,调用current()方法得到与线程相关联的随机生成器,还要调用传参值为10的nextInt()方法。此方法返回0到10之间的伪随机数,每个任务生成10个随机数。
扩展学习
ThreadLocalRandom类还提供生成长整型、浮点型和双精度数字,以及布尔值。一些方法需要提供一个数字作为参数,以生成0到此数字之间的随机数。其他方法需要提供两个参数,以便在这两个数字之间生成随机数。
更多关注
- 第一章“线程管理”中的“使用线程局部变量”小节