线程的执行方法内就是随机生成一定量的字符,然后输出,没必要太多的关注。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;namespace MonitorAndLock
{
    class Program
    {
        private object synObj = new object();
        private string buffer = null;        public void go()
        {
            Thread t1 = new Thread(new ThreadStart(Producer));
            Thread t2 = new Thread(new ThreadStart(Consumer));
            t1.Name = "生产者线程";
            t2.Name = "消费者线程";
            t1.Start();
            t2.Start();
            t1.Join();
            t2.Join();
            Console.ReadKey();
        }        public void Producer()
        {
            Console.WriteLine("{0}:开始执行", Thread.CurrentThread.Name);
            for (int i = 0; i < 16; i++)
            {
                try
                {
                    lock (synObj) 
                    {
                        Random r = new Random();
                        int bufSize = r.Next() % 64;
                        char[] s = new char[bufSize];
                        for (int j = 0; j < bufSize; j++)
                        {
                            s[j] = (char)((int)'A' + r.Next() % 26);
                        }                        buffer = new string(s);
                        Console.WriteLine("{0}:{1}", Thread.CurrentThread.Name, buffer);
                        Monitor.Pulse(synObj);
                        Thread.Sleep(1000);
                    }
                }
                catch (System.Threading.ThreadInterruptedException ex)
                {
                    Console.WriteLine("{0}:被终止{1}", Thread.CurrentThread.Name, ex.Message);
                    break;
                }
                finally
                {
                    Monitor.Exit(synObj);   //只要一调试,就会说:从不同步的代码块中调用了对象同步方法                }
            }            Console.WriteLine("{0}:执行完毕", Thread.CurrentThread.Name);
        }
        public void Consumer()
        {
            Console.WriteLine("{0}:开始执行", Thread.CurrentThread.Name);
            if (buffer == null)
                Thread.Sleep(1000);
            for (int i = 0; i < 16; i++)
            {
                try
                {
                    lock (synObj)
                    {
                        Monitor.Enter(synObj);
                        Console.WriteLine("{0}:{1}", Thread.CurrentThread.Name, buffer);
                        Monitor.Wait(synObj, 1000);
                    
                    }
                }
                catch (System.Threading.ThreadInterruptedException ex)
                {
                    Console.WriteLine("{0}:被终止{1}", Thread.CurrentThread.Name, ex.Message);
                    break;
                }
                finally
                {
                    Monitor.Exit(synObj);
                }            }            Console.WriteLine("{0}:执行完毕", Thread.CurrentThread.Name);
        }    }
    public class Test
    {
        public static void Main()
        {
            Program tt = new Program();
            tt.go();
        }
    }}