public class Clock
{
private object obj = new object();
public void RunClock(int Minute)
{
Thread thread1 = new Thread(() =>
{
int sencond = Minute * 60 / 2;
while (sencond > 0)
{
Di(true);
sencond--;
}
});
Thread thread2 = new Thread(() =>
{
int sencond = Minute * 60 / 2;
while (sencond > 0)
{
Da(true);
sencond--;
}
});
Thread thread3 = new Thread(() =>
{
int sencond = Minute * 60 / 2;
while (sencond > 0)
{
Ye(true);
sencond--;
}
});
thread1.Start();
thread2.Start();
thread3.Start();
}
public void Di(bool flag)
{
lock (obj)
{
Console.WriteLine("滴");
Thread.Sleep(2000);
Monitor.Pulse(obj);
Monitor.Wait(obj);
}
}
public void Da(bool flag)
{
lock (obj)
{
Console.WriteLine("嗒");
Thread.Sleep(3000);
Monitor.Pulse(obj);
Monitor.Wait(obj);
}
}
public void Ye(bool flag)
{
lock (obj)
{
Console.WriteLine("耶");
Thread.Sleep(3000);
Monitor.Pulse(obj);
Monitor.Wait(obj);
}
}
static void Main(string[] args)
{
Clock clock = new Clock();
clock.RunClock(1);
Console.WriteLine("运行完成");
}
结果显示是无序的
在NET多线程开发中,有时候需要多个线程协调工作,完成这个步骤的过程称为“同步”。
使用同步的主要原因:
1.多个线程访问同一个共享资源。
2.多线程写入文件时保证只有一个线程使用文件资源。
3.由事件引发线程,线程等待事件,需要挂起线程。
Monitor实现同步比lock复杂点,lock实际上是Monitor的简便方式,lock最终还是编译成Monitor。
不同处:
1.Monitor在使用的时候需要手动指定锁和手动释放手。
2.Monitor比lock多了几个实用的方法
Wait是让线程暂停,这个方法有个重写,多了一个参数指定暂停的毫秒数。
Pulse是唤醒线程。
thread1.Join();
Monitor.Enter(obj);
while (sencond > 0)
{
Ye(true);
sencond--;
}
Monitor.Exit(obj);
Join 和 (Enter+Exit)的效果相同。但join只是单纯的阻止其他线程,等待此线程。而Monitor更多关心是同步线程时 阻止其他同锁中的线程。
参考写照的原文:http://www.cnblogs.com/hailan2012/archive/2012/03/20/2408179.html