线程中的随机初始化

时间:2015-03-23 15:37:09

标签: java

我是Java新线程的新手,我遇到了一个无法修复的问题。我有一个类Banker,它实现了Runnable接口。在该类的构造函数中,我使用Random类随机初始化一些值。 问题是,如果我在main中创建两个线程,则来自这两个对象的值是相同的。所以,如果我这样做:

Thread t4=new Thread(casier1);
Thread t5=new Thread(casier2);
t4.start();
t5.start();

两个对象都具有相同的值。 我已经读到这种情况正在发生,因为每次我使用Random()时,值都会被时钟初始化。 关于如何解决这个问题的任何想法?谢谢。

public class Customer {
public Customer(){
    Random rand= new Random();
    serviceTime=Math.floor(rand.nextDouble()*100)*50;
    Random rand2= new Random();
    arrivalTime=rand2.nextDouble();
    //init();
    name=FakeNames.getFakeName();
}

现在我知道这可能很难理解,但是:

Banker casier1=new Banker(waitingList);
 Thread t4=new Thread(casier1);
 Banker casier2=new Banker(waitingList2);
 Thread t5=new Thread(casier1);

3 个答案:

答案 0 :(得分:1)

更改Runnable的构造函数以将随机种子作为输入,如此

constructor(long seed, otherVariables...){
    Random random = new Random(seed);
    //Do stuff
}

在主函数中生成几个随机种子,如下所示

Random random = new Random();
long seed1 = random.nextLong();
long seed2 = random.nextLong();

Type casier1 = new Type(seed1, otherArgs);
Type casier2 = new Type(seed2, otherArgs);
Thread t4=new Thread(casier1);
Thread t5=new Thread(casier2);

t4.start();
t5.start();

这应该保证线程产生的随机数的唯一性。

答案 1 :(得分:0)

如果它不是真正需要随机,只需显示随机,请使用

System.getTimeInMillis(); 

始终与之前的值不同:)

或者将其用作随机的种子:

Random r = new Random(System.getTimeInMillis());

答案 2 :(得分:0)

为什么不使用相同的实例?

Random rand = new Random();

Banker casier1 = new Banker(waitingList, rand);
Thread t4 = new Thread(casier1);
Banker casier2 = new Banker(waitingList2, rand);
Thread t5 = new Thread(casier1);