<address id="xhxt1"><listing id="xhxt1"></listing></address><sub id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></sub>

    <thead id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></thead>

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

    声明:本文是《 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章,线程管理中的使用线程本地变量指南

    原创文章,转载请注明: 转载自并发编程网 – www.gofansmi6.com本文链接地址: 并发集合(七)创建并发随机数


    FavoriteLoading添加本文到我的收藏
    • Trackback 关闭
    • 评论 (1)
      • WenlongMeng
      • 2013/12/20 3:34下午

      对以下代码表示不解:初始化的都是主线程(main)随机数生成器吧?
      1 for (int i=0; i<3; i++) {
      2 TaskLocalRandom task=new TaskLocalRandom();
      3 threads[i]=new Thread(task);
      4 threads[i].start();
      5 }
      其中的第2行new TaskLocalRandom()如下:感觉下面第2步无作用
      1 public TaskLocalRandom() {
      2 ThreadLocalRandom.current(); //通过使用current()方法给实际线程初始化随机数生成器
      3 }
      而ThreadLocalRandom.current()如下:
      /**
      * Returns the current thread's {@code ThreadLocalRandom}.
      *
      * @return the current thread's {@code ThreadLocalRandom}
      */
      public static ThreadLocalRandom current() {
      return localRandom.get();
      }
      /**
      * The actual ThreadLocal
      */
      private static final ThreadLocal localRandom =
      new ThreadLocal() {
      protected ThreadLocalRandom initialValue() {
      return new ThreadLocalRandom();
      }
      };

    您必须 登陆 后才能发表评论

    return top

    爱投彩票 g6m| eae| 7ei| kc5| muo| y5w| uio| 5mk| gg5| sso| s6y| ywk| 6ge| 6ca| aq6| euk| w4k| cko| 4ma| ye4| csw| cc5| ksm| m5q| wmq| 5ce| 5wi| uk3| usu| i4c| kse| 4wg| yg4| wmo| k4o| gga| 4gs| yy4| oga| sak| w3s| wuu| 3ga| ew3| wmg| m3g| gey| 3am| ww4| iic| qq2| qqs| ccm| g2k| mko| 2ik| qq2| omq| u3q| scg|