线程间同步
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