1

スレッドを使用して先入れ先出しプロセス スケジューリングを作成しようとしています。各スレッドが完了したら、スレッドを一時停止するか、10 から 20 の間のランダムな数のティックの待機キューに移動してから、ジャンプして戻します。シミュレーション全体を 250 ティックまで実行してから終了します。しかし、最初の「スレッドが実行中または終了しました: 再起動できません」の直後にこのエラーが発生します。ここからどこへ行くべきか本当にわかりません。何かアイデアはありますか? 私のコードは以下です。

public class Alpha
{
    int counter = 0;
    private int sleepTime;
    private static Random rand = new Random();

    public Alpha()
    {
        sleepTime = rand.Next(10001);
    }

    public void Process1()
    {
            Console.WriteLine(string.Format(
                "Process 1 RUNNING (run#: {0})", counter));
            Console.WriteLine();


            Thread current = Thread.CurrentThread;
            Console.WriteLine("{0} going to sleep", current.Name, sleepTime);
            Console.WriteLine();
            Thread.Sleep(sleepTime);
            Console.WriteLine("{0} done sleeping", current.Name);
            Console.WriteLine();    
    }

    public void Process2()
    {
            Console.WriteLine();
            Console.WriteLine(string.Format(
                "Process 2 RUNNING (run#: {0})", counter));
            Console.WriteLine();

            Thread current = Thread.CurrentThread;
            Console.WriteLine("{0} going to sleep", current.Name, sleepTime);
            Console.WriteLine();
            Thread.Sleep(sleepTime);
            Console.WriteLine("{0} done sleeping", current.Name);
            Console.WriteLine();
    }

    public void Process3()
    {
          Console.WriteLine(string.Format(
              "Process 3 RUNNING (run#: {0})",counter));
          Console.WriteLine();

          Thread current = Thread.CurrentThread;
          Console.WriteLine("{0} going to sleep", current.Name, sleepTime);
          Console.WriteLine();
          Thread.Sleep(sleepTime);
          Console.WriteLine("{0} done sleeping", current.Name);
    }

    public void Process4()
    {
          Console.WriteLine(string.Format(
              "Process 4 RUNNING (run#: {0})", x));
          Console.WriteLine();

          Thread current = Thread.CurrentThread;
          Console.WriteLine("{0} going to sleep", current.Name, sleepTime);
          Console.WriteLine();
          Thread.Sleep(sleepTime);
          Console.WriteLine();
          Console.WriteLine("{0} done sleeping", current.Name);
          Console.WriteLine();  
    }
};

public class StepOne
{
    public static void Main()
    {
        Alpha oAlpha = new Alpha();

        Thread bThread = new Thread(new ThreadStart(oAlpha.Process1));
        bThread.Name = "Process 1";
        Thread cThread = new Thread(new ThreadStart(oAlpha.Process2));
        cThread.Name = "Process 2";
        Thread dThread = new Thread(new ThreadStart(oAlpha.Process3));
        dThread.Name = "Process 3";
        Thread eThread = new Thread(new ThreadStart(oAlpha.Process4));
        eThread.Name = "Process 4";

        for (int a = 0; a <= 250; a++)
        {
            bThread.Start();
            while (!bThread.IsAlive) ;
            bThread.Join();
            Console.WriteLine();

            cThread.Start();
            while (!cThread.IsAlive) ;
            cThread.Join();
            Console.WriteLine();

            dThread.Start();
            while (!dThread.IsAlive) ;
            dThread.Join();
            Console.WriteLine();

            eThread.Start();
            while (!eThread.IsAlive) ;
            eThread.Join();
            Console.WriteLine();
        }
    }
}

}

4

1 に答える 1

2

スレッド プロシージャが完了すると、スレッドが終了します。スレッドメソッドを存続させるには、スレッドメソッドにループを配置する必要があります-イベントのような同期プリミティブでブロックし、そのスレッドに作業を再開させたいときに他の場所からそのイベントを通知します。その後、スレッドはその作業項目をキューから取得できます。これは基本的に、組み込みのスレッド プールが行うことであり、他の人が達成したいことよりも優れた方法でのみ行われます。組み込みのスレッド プールを使用できない理由はありますか?

于 2013-03-04T04:36:55.840 に答える