并发集合(七)创建并发随机数

简介:

声明:本文是《 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接口。

1 public class TaskLocalRandom implements Runnable {

2.实现这个类的构造器,通过使用current()方法给实际线程初始化随机数生成器。

1 public TaskLocalRandom() {
2 ThreadLocalRandom.current();
3 }

3.实现run()方法。获取执行这个任务的线程名称,使用nextInt()方法写入10个随机整数到控制台。

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

4.通过实现Main类,并添加main()方法,实现这个例子的主类。

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

5.为3个Thread对象创建一个数组。

1 Thread threads[]=new Thread[3];

6.创建和启动TaskLocalRandom任务,用前面创建的数组存储线程。

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

它是如何工作的…

TaskLocalRandom类是这个例子的关键。在这个类的构造器中,我们使用ThreadLocalRandom的current()方法。这是一个静态方法,它返回当前线程的ThreadLocalRandom对象,你可以使用这个对象生成随机数。如果调用这个方法的线程没有与任何(ThreadLocalRandom)对象关联,这个类将创建一个新的ThreadLocalRandom对象。在这种情况下,你使用这个方法初始化与任务相关的随机数生成器,所以,在这个方法下次调用时,它将创建ThreadLocalRandom对象。

在TaskLocalRandom类的run()方法中,调用一次current()方法来生成与线程相关的随机数生成器,然后,你调用一次nextInt()方法,并传入数值10作为参数。这个方法将返回0到10之间的一个伪随机数。每个任务生成10个随机数。

不止这些…

ThreadLocalRandom类同样提供方法来生成long、float 和 double类型的数以及 Boolean值。这些方法允许你传入一个数值作为参数,然后生成0到这个数值之间的随机数。还有允许你传入两个参数的其他方法,然后生成在这两个参数数值之间的随机数。

参见

目录
相关文章
|
7月前
|
设计模式 SQL 安全
Java面试题:设计一个线程安全的内存管理器,使用观察者模式来通知所有线程内存使用情况的变化。如何确保在添加和移除内存块时的线程安全?如何确保任务的顺序执行和调度器的线程安全?
Java面试题:设计一个线程安全的内存管理器,使用观察者模式来通知所有线程内存使用情况的变化。如何确保在添加和移除内存块时的线程安全?如何确保任务的顺序执行和调度器的线程安全?
66 0
|
7月前
|
设计模式 安全 NoSQL
Java面试题:设计一个线程安全的单例模式,并解释其内存占用和垃圾回收机制;使用生产者消费者模式实现一个并发安全的队列;设计一个支持高并发的分布式锁
Java面试题:设计一个线程安全的单例模式,并解释其内存占用和垃圾回收机制;使用生产者消费者模式实现一个并发安全的队列;设计一个支持高并发的分布式锁
95 0
|
9月前
|
安全 容器
线程安全的集合类(多线程环境下使用ArrayList、队列及哈希表)
线程安全的集合类(多线程环境下使用ArrayList、队列及哈希表)
|
9月前
|
Java
【Java】有 A、B、C 三个线程,如何保证三个线程同时执行?在并发情况下,如何保证三个线程依次执行?如何保证三个线程有序交错执行?
【Java】有 A、B、C 三个线程,如何保证三个线程同时执行?在并发情况下,如何保证三个线程依次执行?如何保证三个线程有序交错执行?
90 0
|
安全 Java 程序员
JUC中创建的组件 && 多线程使用“哈希表”
JUC中创建的组件 && 多线程使用“哈希表”
66 0
集合线程安全问题:第一章:集合类不安全之并发修改异常
集合线程安全问题:第一章:集合类不安全之并发修改异常
152 0
集合线程安全问题:第一章:集合类不安全之并发修改异常
|
安全
HashMap在多线程使用场景下会存在线程安全问题,怎么处理?
HashMap在多线程使用场景下会存在线程安全问题,怎么处理?
195 0
|
安全 开发者
JUC并发(并发的包)下的CopyOnWriteArrayList(线程安全的集合)
JUC并发(并发的包)下的CopyOnWriteArrayList(线程安全的集合)
148 0
JUC并发(并发的包)下的CopyOnWriteArrayList(线程安全的集合)
|
安全 Java
看山聊并发:如果非要在多线程中使用ArrayList会发生什么?
我们都知道,Java中的ArrayList是非线程安全的,这个知识点太熟了,甚至面试的时候都很少问了。
223 0
看山聊并发:如果非要在多线程中使用ArrayList会发生什么?
|
存储 Java
【Java 并发编程】线程池机制 ( ThreadPoolExecutor 线程池构造参数分析 | 核心线程数 | 最大线程数 | 非核心线程存活时间 | 任务阻塞队列 )
【Java 并发编程】线程池机制 ( ThreadPoolExecutor 线程池构造参数分析 | 核心线程数 | 最大线程数 | 非核心线程存活时间 | 任务阻塞队列 )
240 0