一个任务和其余三个共享锁

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            Thread a = new Thread(new ThreadStart(RunA));
            a.Start();
            Thread b = new Thread(new ThreadStart(RunB));
            b.Start();
            Thread c = new Thread(new ThreadStart(RunC));
            c.Start();
            Thread d = new Thread(new ThreadStart(RunD));
            d.Start();

            Console.Read();
        }

        private static Random r = new Random();
        private static object LockObjectA = new object();
        private static object LockObjectB = new object();
        private static object LockObjectC = new object();
        static void RunA()
        {
            var totalTime = 0;
            var time = DateTime.Now;
            lock (LockObjectA)
            {
                var i = 1;
                // 一分钟以内多次执行
                while (DateTime.Now.Subtract(time).TotalMinutes < 1)
                {
                    var sleepTime = r.Next(1, 10);
                    Thread.Sleep(sleepTime * 1000);
                    totalTime += sleepTime;
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine(string.Format("A run{0} sleep:{1} Total:{2}", i++, sleepTime, totalTime));
                    sleepTime = r.Next(10);
                    Thread.Sleep(sleepTime * 1000);
                }
            }
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("A Over " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
        }

        static void RunB()
        {
            var totalTime = 0;
            var time = DateTime.Now;
            lock (LockObjectB)
            {
                var i = 1;
                // 一分钟以内多次执行
                while (DateTime.Now.Subtract(time).TotalMinutes < 1)
                {
                    var sleepTime = r.Next(1, 10);
                    Thread.Sleep(sleepTime * 1000);
                    totalTime += sleepTime;
                    Console.ForegroundColor = ConsoleColor.Yellow;
                    Console.WriteLine(string.Format("B run{0} sleep:{1} Total:{2}", i++, sleepTime, totalTime));
                    sleepTime = r.Next(10);
                    Thread.Sleep(sleepTime * 1000);
                }
            }
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine("B Over " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
        }

        static void RunC()
        {
            var totalTime = 0;
            var time = DateTime.Now;
            lock (LockObjectC)
            {
                var i = 1;
                  // 一分钟以内多次执行
                while (DateTime.Now.Subtract(time).TotalMinutes < 1)
                {
                    var sleepTime = r.Next(1, 10);
                    Thread.Sleep(sleepTime * 1000);
                    totalTime += sleepTime;
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine(string.Format("C run{0} sleep:{1} Total:{2}", i++, sleepTime, totalTime));
                    sleepTime = r.Next(10);
                    Thread.Sleep(sleepTime * 1000);
                }
            }
            Console.ForegroundColor = ConsoleColor.Green;
            Console.WriteLine("C Over " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
        }


        static void RunD()
        {
            var queue = new Queue();
            queue.Enqueue(LockObjectA);
            queue.Enqueue(LockObjectB);
            queue.Enqueue(LockObjectC);

            while (queue.Count > 0)
            {
                var obj = queue.Dequeue();
                var lockTaken = false;
                Monitor.TryEnter(obj, ref lockTaken);
                if (lockTaken)
                {
                    if (obj == LockObjectA)
                    {
                        Console.WriteLine("get A");
                    }
                    else if (obj == LockObjectB)
                    {
                        Console.WriteLine("get B");
                    }
                    else if (obj == LockObjectC)
                    {
                        Console.WriteLine("get C");
                    }
                    else
                    {
                        Console.WriteLine("bug");
                    }
                }
                else
                {
                    queue.Enqueue(obj);
                }
            }
         Monitor.Exit(LockObjectA);
               Monitor.Exit(LockObjectB);
         Monitor.Exit(LockObjectC); Console.WriteLine(
"D run"); } }

 

posted @ 2021-03-25 16:44  江境纣州  阅读(52)  评论(0)    收藏  举报