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