您的位置:首页 > 编程语言 > C#

C#生产者与消费者问题(二)

2013-08-27 12:53 281 查看
/*
 * Created by SharpDevelop.
 * User: huangyibiao
 * Date: 2013/8/27
 * Time: 11:12
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Threading;

namespace ThreadTest
{
	class Program
	{
		public static void Main(string[] args)
		{
			// create share resource 
			Resource sharedResource = new Resource();
			
			ProduceThread produceThread = new ProduceThread(sharedResource);
			ConsumeThread consumeThread = new ConsumeThread(sharedResource);
			
			// create two thread
			Thread producer = new Thread(new ThreadStart(produceThread.Run));
			Thread consumer = new Thread(new ThreadStart(consumeThread.Run));
			
			try
			{
				producer.Start();
				consumer.Start();
				
				producer.Join();
				consumer.Join();
			}
			catch (ThreadStateException e)
			{
				Console.WriteLine(e.ToString());
			}
			
			Console.ReadKey();
		}
		
	}
	
	public class ProduceThread
	{
		/// <summary>
		/// share resource
		/// </summary>
		Resource _resource;
		
		public ProduceThread(Resource res)
		{
			_resource = res;
		}
		
		// begin to produce
		public void Run()
		{
			for (int i = 0; i < 10; ++i)
			{
				_resource.Produce();
			}
		}
	}
	
	public class ConsumeThread
	{
		/// <summary>
		/// share resource
		/// </summary>
		Resource _resource;
		
		public ConsumeThread(Resource res)
		{
			_resource = res;
		}
		
		public void Run()
		{
			for (int i = 0; i < 10; ++i)
			{
				_resource.Consume();
			}
		}
	}
	
	public class Resource
	{
		int _resourceContent = 0;
		bool _flag = false;
		
		/// <summary>
		/// consume method
		/// </summary>
		public void Consume()
		{
			// get access power
			Monitor.Enter(this);
			
			// if this object has been locked by other thread, then wait.
			if (!_flag)
			{
				try
				{
					Monitor.Wait(this);
				}
				catch (SynchronizationLockException e)
				{
					Console.WriteLine(e);
				}
				catch (ThreadInterruptedException e)
				{
					Console.WriteLine(e);
				}
			}
			
			// show contents after getting the access power
			Console.WriteLine("Consumer: {0}", _resourceContent);
			_flag = false;
			
			Monitor.Pulse(this);// tell the waiting thread, Consume method has finished
			Monitor.Exit(this); // exit the synchronization 
		}
		
		/// <summary>
		/// puroduce method
		/// </summary>
		public void Produce()
		{
			// get access power
			Monitor.Enter(this);
			
			// if this object has been locked by other thread, then wait.
			if (_flag)
			{
				try
				{
					Monitor.Wait(this);
				}
				catch (SynchronizationLockException e)
				{
					Console.WriteLine(e);
				}
				catch (ThreadInterruptedException e)
				{
					Console.WriteLine(e);
				}
			}
			
			// show contents after getting the access power
			Console.WriteLine("Consumer: {0}", ++_resourceContent);
			_flag = true;
			
			Monitor.Pulse(this);// tell the waiting thread, Consume method has finished
			Monitor.Exit(this); // exit the synchronization 
		}
	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: