public static void Main(String[] args)
        {
            int        result = 0; // Result initialized to say there is no error 0 no error 1 error
            SharedData data   = new SharedData();

            SharedDataProd prod = new SharedDataProd(data, 20);
            SharedDataCons cons = new SharedDataCons(data, 20);

            Thread producer = new Thread(new ThreadStart(prod.ThreadRun));
            Thread consumer = new Thread(new ThreadStart(cons.ThreadRun));

            // Threads producer and consumer have been created

            try
            {
                producer.Start();
                consumer.Start();

                producer.Join();
                consumer.Join();
                // threads producer and consumer have finished at this point.
            }
            catch (ThreadStateException e)
            {
                Console.WriteLine(e);  // Display text of exception
                result = 1;
            }
            catch (ThreadInterruptedException e)
            {
                Console.WriteLine(e);  // This exception means that the thread
                // was interrupted during a Wait
                result = 1;
            }

            Console.WriteLine("Press any key to end the program.");
            Console.ReadKey();

            // This provides a return code to
            // the parent process.
            Environment.ExitCode = result;
        }
        public static void Main(String[] args)
        {
            int result = 0;   // Result initialized to say there is no error 0 no error 1 error
            SharedData data = new SharedData();

            SharedDataProd prod = new SharedDataProd(data, 20);
            SharedDataCons cons = new SharedDataCons(data, 20);

            Thread producer = new Thread(new ThreadStart(prod.ThreadRun));
            Thread consumer = new Thread(new ThreadStart(cons.ThreadRun));
            // Threads producer and consumer have been created

            try
            {
                producer.Start();
                consumer.Start();

                producer.Join();
                consumer.Join();
                // threads producer and consumer have finished at this point.
            }
            catch (ThreadStateException e)
            {
                Console.WriteLine(e);  // Display text of exception
                result = 1;
            }
            catch (ThreadInterruptedException e)
            {
                Console.WriteLine(e);  // This exception means that the thread
                // was interrupted during a Wait
                result = 1;
            }

            Console.WriteLine("Press any key to end the program.");
            Console.ReadKey();

            // This provides a return code to
            // the parent process.
            Environment.ExitCode = result;
        }