c#

位置:IT落伍者 >> c# >> 浏览文章

C#多线程学习—生产者和消费者(3)


发布日期:2020年12月22日
 
C#多线程学习—生产者和消费者(3)

下面定义生产者类 CellProd 和消费者类 CellCons 它们都只有一个方法ThreadRun()以便在Main()函数中提供给线程的ThreadStart代理对象作为线程的入口

public class CellProd

{

Cell cell; // 被操作的Cell对象

int quantity = ; // 生产者生产次数初始化为

public CellProd(Cell box int request)

{

//构造函数

cell = box;

quantity = request;

}

public void ThreadRun( )

{

for(int looper=; looper<=quantity; looper++)

cellWriteToCell(looper); //生产者向操作对象写入信息

}

}

public class CellCons

{

Cell cell;

int quantity = ;

public CellCons(Cell box int request)

{

//构造函数

cell = box;

quantity = request;

}

public void ThreadRun( )

{

int valReturned;

for(int looper=; looper<=quantity; looper++)

valReturned=cellReadFromCell( );//消费者从操作对象中读取信息

}

}

然后在下面这个类MonitorSample的Main()函数中我们要做的就是创建两个线程分别作为生产者和消费者使用CellProdThreadRun()方法和CellConsThreadRun()方法对同一个Cell对象进行操作

public class MonitorSample

{

public static void Main(String[] args)

{

int result = ; //一个标志位如果是表示程序没有出错如果是表明有错误发生

Cell cell = new Cell( );

//下面使用cell初始化CellProd和CellCons两个类生产和消费次数均为

CellProd prod = new CellProd(cell );

CellCons cons = new CellCons(cell );

Thread producer = new Thread(new ThreadStart(prodThreadRun));

Thread consumer = new Thread(new ThreadStart(consThreadRun));

//生产者线程和消费者线程都已经被创建但是没有开始执行

try

{

producerStart( );

consumerStart( );

producerJoin( );

consumerJoin( );

ConsoleReadLine();

}

catch (ThreadStateException e)

{

//当线程因为所处状态的原因而不能执行被请求的操作

ConsoleWriteLine(e);

result = ;

}

catch (ThreadInterruptedException e)

{

//当线程在等待状态的时候中止

ConsoleWriteLine(e);

result = ;

}

//尽管Main()函数没有返回值但下面这条语句可以向父进程返回执行结果

EnvironmentExitCode = result;

}

}

在上面的例程中同步是通过等待MonitorPulse()来完成的首先生产者生产了一个值而同一时刻消费者处于等待状态直到收到生产者的脉沖(Pulse)通知它生产已经完成此后消费者进入消费状态而生产者开始等待消费者完成操作后将调用MonitorPulese()发出的脉沖

它的执行结果很简单

Produce Consume Produce Consume Produce Consume ……

Produce Consume

事实上这个简单的例子已经帮助我们解决了多线程应用程序中可能出现的大问题只要领悟了解决线程间沖突的基本方法很容易把它应用到比较复杂的程序中去

               

上一篇:C#中COM操作(一)---实例化[2]

下一篇:C#中动态加载和卸载DLL