///
/// 被操作的对象
///
public class Cell
{
///
/// Cell 对象里的内容
///
int cellContents;
///
/// 状态标志: 为 true 时可以读取,为 false 则正在写入
///
bool readerFlag = false;
public int ReadFromCell()
{
lock (this)
{
if (!readerFlag)
{
try
{
// 等待 WriteToCell 方法中调用 Monitor.Pulse()方法
Monitor.Wait(this);
}
catch (SynchronizationLockException e)
{
Console.WriteLine(e);
}
catch (ThreadInterruptedException e)
{
Console.WriteLine(e);
}
}
// 开始消费行为
Console.WriteLine("Consume: {0}", cellContents);
Console.WriteLine();
// 重置 readerFlag 标志,表示消费行为已经完成
readerFlag = false;
// 通知 WriteToCell()方法(该方法在另外一个线程中执行,等待中)
Monitor.Pulse(this);
}
return cellContents;
}
public void WriteToCell(int n)
{
lock (this)
{
if (readerFlag)
{
try
{
Monitor.Wait(this);
}
catch (SynchronizationLockException e)
{
// 当同步方法(指Monitor类除Enter之外的方法)在非同步的代码区被调用
Console.WriteLine(e);
}
catch (ThreadInterruptedException e)
{
// 当线程在等待状态的时候中止
Console.WriteLine(e);
}
}
cellContents = n;
Console.WriteLine("Produce: {0}", cellContents);
readerFlag = true;
Monitor.Pulse(this); // 通知另外一个线程中正在等待的 ReadFromCell() 方法
}
}
}
///
/// 生产者
///
public class CellProd
{
///
/// 被操作的 Cell 对象
///
Cell cell;
///
/// 生产者生产次数,初始化为 1
///
int quantity = 1;
public CellProd(Cell box, int request)
{
cell = box;
quantity = request;
}
public void ThreadRun()
{
for (int looper = 1; looper { // 生产者向操作对象写入信息 cell.WriteToCell(looper); } }} /// /// 消费者/// public class CellCons{ Cell cell; int quantity = 1; public CellCons(Cell box, int request) { cell = box; quantity = request; } public void ThreadRun() { int valReturned; for (int looper = 1; looper { valReturned = cell.ReadFromCell(); // 消费者从操作对象中读取信息 } }} /// /// 测试类/// public class MonitorSample{ public static void Main(String[] args) { // 一个标志位,如果是 0 表示程序没有出错,如果是 1 表明有错误发生 int result = 0; // 下面使用 cell 初始化 CellProd 和 CellCons 两个类,生产和消费次数均为 20 次 Cell cell = new Cell(); CellProd prod = new CellProd(cell, 20); CellCons cons = new CellCons(cell, 20); Thread producer = new Thread(new ThreadStart(prod.ThreadRun)); Thread consumer = new Thread(new ThreadStart(cons.ThreadRun)); // 生产者线程和消费者线程都已经被创建,但是没有开始执行 try { producer.Start(); consumer.Start(); producer.Join(); consumer.Join(); Console.ReadLine(); } catch (ThreadStateException e) { // 当线程因为所处状态的原因而不能执行被请求的操作 Console.WriteLine(e); result = 1; } catch (ThreadInterruptedException e) { // 当线程在等待状态的时候中止 Console.WriteLine(e); result = 1; } // 尽管 Main() 函数没有返回值,但下面这条语句可以向父进程返回执行结果 Environment.ExitCode = result; }}
Original: https://www.cnblogs.com/SkySoot/p/3494609.html
Author: SkySoot
Title: C# 多线程详解 Part.04(Lock、Monitor、生产与消费)
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/539888/
转载文章受原作者版权保护。转载请注明原作者出处!