Thread Synchronization in C#

 Thread Synchronization in C#



using System;

using System.Collections;

using System.Numerics;

using System.Threading;

using System.Threading.Tasks;


namespace CSharp

{

    public class Q

    {

    Queue q = new Queue();


        public void put(int n)

        {

            lock (this)

            {

                while(q.Count==1)

                {

                    Monitor.Wait(this);

                }

                q.Enqueue(n);            

                Monitor.Pulse(this);

            }

        }


        public int get()

        {

            lock (this)

            {

                while (q.Count==0)

                {                

                    Monitor.Wait(this);

                }

                int n = (int)q.Dequeue();

                Monitor.Pulse(this);

                return n;

            }

        }

    }


    public class Consumer 

    {

        Q q;


        public Consumer(Q q)

        {

            this.q = q;

            new Thread(new ThreadStart(this.Consume)).Start();

        }



        public void Consume()

        {

            for (int i=1; i <= 5; i++)

            {

                int n = q.get();

                Console.WriteLine ("Consuming {0}", n);

                Thread.Sleep(200);

            }

        }

    }

    

    public class Producer 

    {

        Q q;


        public Producer(Q q)

        {

            this.q = q;

            new Thread(new ThreadStart(this.Produce)).Start();

        }



        public void Produce()

        {

            for (int i=1; i <= 5; i++)

            {

                q.put(i);

                Console.WriteLine ("Producing {0}", i);

                Thread.Sleep(200);

            }

        }

    }

    

    public class Program

    {

        public static void Main(string[] args)

        {

            Q q = new Q();

            

            new Producer(q);

            new Consumer(q); 

        }

    }

}