C#,Task多线程

有一个果篮,可以向这个果篮中放置苹果,

(通过控制台输入的数字,决定每次放到果篮中的苹果数量)

有3个孩子会从这个果篮中每次拿一个苹果吃掉,吃完后继续从果篮中拿苹果吃,

(3个孩子吃苹果分别需要3秒、2秒、4秒)

请利用Task多线程编写程序实现以下功能在控制台打印输出:

设计3个类代表3个孩子去从果篮中获取苹果;

每个孩子需要收到一个消息(苹果被第一次放置时)后,才会去果篮中拿苹果来吃;

每个孩子拿完一个苹果后,会花一定的时间来吃苹果,吃完后继续从果篮中拿苹果吃;

如果果篮空了,则每隔2秒去看下果篮中是否有苹果,有就拿来吃。

参考

using System;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp1
{
    class Child
    {
        public int eatSecond { get; set; }
        public int waitSecond { get; set; }
        public string name { get; set; }
        public event EventHandler<EventArgs> OnPlaceApple;
        public void PlaceApple()
        {
            OnPlaceApple(this, new EventArgs());
        }

        public void EatApple(Basket o)
        {
             new Task(() => {
                 while (true)
                 {
                     if (o.num == 0)
                     {
                         Console.WriteLine("已吃完," + this.name + "等待中-" + DateTime.Now);
                         Thread.Sleep(this.waitSecond*1000);
                     }
                     else
                     {
                         int i;
                         lock (o) { i = o.num; o.num--; }

                         Console.WriteLine(this.name + "正在吃第" + i + "个苹果-"+DateTime.Now);
                         Thread.Sleep(this.eatSecond * 1000);
                     }
                 }
            }).Start();

        }

    }

    class Basket
    {
        public int num { get; set; }
    }
    class Program
    {
        static Basket basket = null;
        static void PlaceApply(object sender, EventArgs e)
        {
            var o = (Child)sender;
            o.EatApple(basket);
        }
        static void Main(string[] args)
        {
            var a = new Child { name = "A", eatSecond = 3, waitSecond = 2 };
            a.OnPlaceApple += PlaceApply;


            var b = new Child { name = "B", eatSecond = 2, waitSecond = 2 };
            b.OnPlaceApple += PlaceApply;


            var c = new Child { name = "C", eatSecond = 4, waitSecond = 2 };
            c.OnPlaceApple += PlaceApply;

            Console.Write("输入苹果数量:");
            var s = Console.ReadLine();
            var num = int.Parse(s);
            basket = new Basket { num = num };


            a.PlaceApple();
            b.PlaceApple();
            c.PlaceApple();


            new Task(() =>{ 
                Thread.Sleep(20000);
                Console.WriteLine("20s后重新设置苹果数量为20");
                lock (basket) { basket.num = 20; }
            }).Start();

            Console.ReadKey();
        }
    }
}

 

插眼,我也想学习一下

 class Basket
    {
        static object _Lock = new object();
        int _appleCount;

        public bool TakeApple()
        {
            lock (_Lock)
            {
                if (_appleCount > 0)
                {
                    --_appleCount;
                    return true;
                }
                return false;
            }
        }

        public void PlaceApple(int count)
        {
            lock (_Lock)
            {
                _appleCount += count;
            }
        }
    }

    class Children
    {
        Basket _basket;
        bool _stop;

        public string Name { get; set; }
        public int EatAppleTime { get; set; }
        public int WaitAppleTime { get; set; }

        public Children(Basket basket)
        {
            _basket = basket;
        }

        public void Start()
        {
            _stop = false;
            Task.Run(() =>
            {
                while (!_stop)
                {
                    Console.WriteLine($"{Name} 去拿苹果");
                    if (_basket.TakeApple())
                    {
                        Console.WriteLine($"{Name} 拿到了苹果");
                        EatApple();
                    }
                    else
                    {
                        Console.WriteLine($"{Name} 没拿到苹果");
                        Thread.Sleep(TimeSpan.FromSeconds(WaitAppleTime));
                    }
                }
            });
        }

        public void Stop()
        {
            _stop = true;
        }

        public void EatApple()
        {
            Console.WriteLine($"{Name} 开始吃苹果");
            Thread.Sleep(TimeSpan.FromSeconds(EatAppleTime));
            Console.WriteLine($"{Name} 吃完了苹果");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var basket = new Basket();

            var a = new Children(basket)
            {
                Name = "A",
                EatAppleTime = 3,
                WaitAppleTime = 2
            };
            var b = new Children(basket)
            {
                Name = "B",
                EatAppleTime = 2,
                WaitAppleTime = 2
            };
            var c = new Children(basket)
            {
                Name = "C",
                EatAppleTime = 4,
                WaitAppleTime = 2
            };
            Console.WriteLine("程序开始 输入数字为 放入苹果数量 非法输入时停止");
            a.Start();
            b.Start();
            c.Start();
            while (int.TryParse(Console.ReadLine(),out var count))
            {
                basket.PlaceApple(count);
            }
            a.Stop();
            b.Stop();
            c.Stop();
        }
    }