线程间同步

  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

posted @ 2012-03-22 14:15  Shikyoh  阅读(1318)  评论(0编辑  收藏  举报