static void Main(string[] args) { //initalize philosophers Philosophers philo = new Philosophers(); //Declare all philosophis as threads Thread p0 = new Thread(philo.PhilosophMethod); Thread p1 = new Thread(philo.PhilosophMethod); Thread p2 = new Thread(philo.PhilosophMethod); Thread p3 = new Thread(philo.PhilosophMethod); Thread p4 = new Thread(philo.PhilosophMethod); p0.Start(0); p1.Start(1); p2.Start(2); p3.Start(3); p4.Start(4); Console.ReadLine(); }
public void NextState(Philosophers p) { Thread.Sleep(1000); //随机到的数字小于0.5 if (_next.NextDouble() < 0.5) { lock (Locker) { //放下叉子,如果之前的状态是吃饭 //如果之前的状态也是思考,就不需要放下叉子 if (p.CurrentState == State.Eat) { _folks[p.Index] = 0; if (p.Index != 4) { _folks[p.Index + 1] = 0; } else { _folks[0] = 0; } } //开始思考 p.CurrentState = State.Think; Console.WriteLine("{0}开始思考。当前叉子状态: {1}", p.Name, string.Join(",", _folks)); } } else { //正在吃就接着吃 if (p.CurrentState == State.Eat || NumOfFood == 0) { return; } //尝试开吃 lock (Locker) { //左边的叉子 var folkLeft = p.Index; //右边的叉子 var folkRight = p.Index == 4 ? 0 : p.Index + 1; //只有左右两边的叉子都没人用才可以开吃 if (_folks[folkLeft] == 0 && _folks[folkRight] == 0) { p.CurrentState = State.Eat; _folks[folkLeft] = 1; _folks[folkRight] = 1; NumOfFood--; Console.WriteLine("{0}开始吃饭,并拿起叉子{1}和{2}。食物总量: {3}, 当前叉子状态: {4}", p.Name, folkLeft, folkRight, NumOfFood, string.Join(",", _folks)); } else { Console.WriteLine("{0}无法开始吃饭,因为他需要拿起叉子{1}和{2}。当前叉子状态: {3}", p.Name, folkLeft, folkRight, string.Join(",", _folks)); } } } }