我是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);
答案 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);