2013-03-04 65 views
1

我想创建一个使用线程的先进先出进程调度。每个线程完成后,我希望它暂停它或将它移动到等待队列中,以获得10到20之间的随机数,然后让它跳回去。我希望整个模拟运行到250个滴答,然后终止但是在第一个“线程正在运行或终止:无法重新启动”之后,我收到了这个错误。不知道从哪里出发,有什么想法?我的代码如下。使用线程的FIFO进程调度

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(); 
     } 
    } 
} 

}

+0

为什么你只在一次只有一个线程工作时试图使用'Thread's?整个问题与FIFO处理有什么关系?在代码中我没有看到类似的东西。 – svick 2013-03-04 07:28:47

回答

2

当线程完成PROC它终止线程。您必须在线程方法中放置一个循环以保持活动状态 - 您可以在同步原语(如事件)上阻止该循环,然后在其他地方发出该事件的信号,以便让该线程恢复工作。该线程可以从队列中获取其工作项目。这基本上就是内置线程池只能以比我们其他人希望实现的更好的方式进行操作。任何原因你不能只使用内置的线程池?

+0

+1 - 像OP设计这样的'线程管理员'最好是错误的'脆弱'。将任务排队到池更安全/更容易。 – 2013-03-04 09:49:00