有一个果篮,可以向这个果篮中放置苹果,
(通过控制台输入的数字,决定每次放到果篮中的苹果数量)
有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();
}
}