Thread C# Tutorial

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime;
using System.Runtime.CompilerServices;
using System.Security;
using System.Text;
using System.Threading;
public class MainClass
{
    private static Queue sharedQueue = new Queue();    
    public static void Main()
    {
        Thread t1 = new Thread(Producer);
        Thread t2 = new Thread(Consumer);
        t1.Start();
        t2.Start();
        // Join on them:
        t1.Join();
        t2.Join();
    }
    private static void Producer()
    {
        for (int i = 0; i < 2; i++)
        {
            string item = "Item#" + i;
            lock (sharedQueue)
            {
                sharedQueue.Enqueue(item);
                Monitor.Pulse(sharedQueue);
            }
        }
    }
    private static void Consumer()
    {
        for (int i = 0; i < 2; i++)
        {
            string item = null;
            lock (sharedQueue)
            {
                while (sharedQueue.Count == 0)
                    Monitor.Wait(sharedQueue);
                item = sharedQueue.Dequeue();
            }
            Console.WriteLine("Processing item: {0}", item);
        }
    }
}
Processing item: Item#0
Processing item: Item#1