1

2つのスレッドを持つC#コードがあります。printメソッドを呼び出しますが、常に同じ時間があります..なぜですか?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace MultiThreading
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread thread = new Thread(new ThreadStart(new Program().print));
            Thread thread2 = new Thread(new ThreadStart(new Program().print));
            thread.Name = "Thread1";
            thread2.Name = "thread2";  
            thread.Start();
            thread2.Start();

        }

        public void print()
        {
            Random r = new Random();
            int time = r.Next(3000);
            System.Console.WriteLine(Thread.CurrentThread.Name + ", " + (double)time/1000 + " secs!");
            Thread.Sleep(time);           
        }
    }
}

わかりました。2つのスレッドがあり、それぞれに「印刷」デリゲートがあります。

printは、timetime秒の数値を生成します。

threadthread2常に同じ時間を生成しますが、それを修正するにはどうすればよいですか?

4

4 に答える 4

2

あなたの混乱は、スレッドが原因ではなく、乱数ジェネレーターが原因です。

MSDN は次のように述べています。

乱数の生成はシード値から始まります。同じシードを繰り返し使用すると、同じ一連の数値が生成されます。異なるシーケンスを生成する 1 つの方法は、シード値を時間依存にすることです。これにより、Random の新しいインスタンスごとに異なるシリーズが生成されます。

新しいランダム行をこれに置き換えてみて、違いを確認してください。

Random r = new Random(Thread.CurrentThread.ManagedThreadId);

すべてのスレッドが異なる値を取得するように、新しいランダム シードを追加しました。

編集: ManagedThreadId の代わりに、シード値に選択した他の値を使用できます。Random オブジェクトから異なる乱数シーケンスを取得するには、異なることを確認する必要があります。ManagedThreadId があまり良い選択ではない理由については、以下のコメントを参照してください。

于 2012-12-27T07:41:46.400 に答える
1

スレッド開始メソッドの間にSystem.Threading.Thread.Sleepメソッドを使用して、それらを間隔を置いて開始することができます。

thread.Start();
System.Threading.Thread.Sleep(100);
thread2.Start();
于 2012-12-27T07:39:50.860 に答える
0

問題は Random() メソッドの呼び出しだと思います! すべてのスレッドで異なるシードを使用してみてください。そうしないと、常に同じ乱数が得られます。

于 2012-12-27T07:50:50.053 に答える