C#中每个对象的新线程
本文关键字:线程 新线程 对象 | 更新日期: 2023-09-27 18:23:54
我有以下代码:
Thread[] threadArray= new Thread[3];
MyObject[] objectArray = new MyObject[3];
for (int i = 0; i < 3; i++)
{
//Create new HotelSupplier object
objectArray[i] = new MyObject();
//Create array of threads and start a new thread for each HotelSupplier
threadArray[i] = new Thread(new ThreadStart(objectArray[i].run));
//Store the name of the thread
threadArray[i].Name = i.ToString();
//Start the thread
threadArray[i].Start();
}
我创建了3个对象和3个线程。所有对象都存储在一个数组中,所有线程都存储在数组中。
MyObject中的run方法生成一个介于最小和最大之间的随机数
Random random = new Random();
double min = 50.00;
double max = 500.00;
double price = random.NextDouble() * (max - min) + min;
Console.WriteLine("GENERATING PRICE: " + price);
我的输出:
GENERATING PRICE: 101.271334780041
GENERATING PRICE: 101.271334780041
GENERATING PRICE: 101.271334780041
我预计会有3个不同的随机数,而不是只有一个,因为我认为每个线程都会在不同的对象上运行。
我做错了什么,我不了解线程的哪些方面?
您的原始代码导致所有Random
实例都使用相同的值进行种子设定。
修复此问题的最低影响方法是移动代码以创建Random
:
void Run()
{
//...
Random random = new Random();
//...
}
在Run
方法之外,并转换为private static
变量,因此它变为:
private static Random random = new Random();
void Run()
{
//...
}
因此它在CCD_ 5的所有实例上仅被播种一次。
这是因为Random是用当前时间播种的,但时间分辨率通常只有15ms。换句话说,你的三个随机生成器都在同一个15毫秒的帧内初始化的几率很高,它们都有相同的种子,因此都会产生相同的值。
我建议您在初始线程上创建第一个随机生成器,生成三个随机值,并将它们用作其他线程的生成器的种子。