自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C#生產(chǎn)者和消費(fèi)者

開(kāi)發(fā) 后端
本文介紹定義C#生產(chǎn)者和消費(fèi)者,它們都只有一個(gè)方法ThreadRun(),以便在Main()函數(shù)中提供給線程的ThreadStart代理對(duì)象,作為線程的入口。

下面定義C#生產(chǎn)者和消費(fèi)者,它們都只有一個(gè)方法ThreadRun(),以便在Main()函數(shù)中提供給線程的ThreadStart代理對(duì)象,作為線程的入口。

  1. public class CellProd  
  2. {  
  3. Cell cell; // 被操作的Cell對(duì)象  
  4. int quantity = 1; // 生產(chǎn)者生產(chǎn)次數(shù),初始化為1  
  5.  
  6. public CellProd(Cell box, int request)  
  7. {  
  8. //構(gòu)造函數(shù)  
  9. cell = box;  
  10. quantity = request;  
  11. }  
  12. public void ThreadRun( )  
  13. {  
  14. for(int looper=1; looper<=quantity; looper++)  
  15. cell.WriteToCell(looper); //生產(chǎn)者向操作對(duì)象寫入信息  
  16. }  
  17. }  
  18.  
  19. public class CellCons  
  20. {  
  21. Cell cell;  
  22. int quantity = 1;  
  23.  
  24. public CellCons(Cell box, int request)  
  25. {  
  26. //構(gòu)造函數(shù)  
  27. cell = box;  
  28. quantity = request;  
  29. }  
  30. public void ThreadRun( )  
  31. {  
  32. int valReturned;  
  33. for(int looper=1; looper<=quantity; looper++)  
  34. valReturned=cell.ReadFromCell( );//消費(fèi)者從操作對(duì)象中讀取信息  
  35. }  

然后在下面這個(gè)類MonitorSample的Main()函數(shù)中,我們要做的就是創(chuàng)建兩個(gè)線程分別作為C#生產(chǎn)者和消費(fèi)者,使用CellProd.ThreadRun()方法和CellCons.ThreadRun()方法對(duì)同一個(gè)Cell對(duì)象進(jìn)行操作

  1. public class MonitorSample  
  2. {  
  3. public static void Main(String[] args)  
  4. {  
  5. int result = 0;   
  6. //一個(gè)標(biāo)志位,如果是0表示程序沒(méi)有出錯(cuò),如果是1表明有錯(cuò)誤發(fā)生  
  7. Cell cell = new Cell( );  
  8.  
  9. //下面使用cell初始化CellProd和CellCons兩個(gè)類,生產(chǎn)和消費(fèi)次數(shù)均為20次  
  10. CellProd prod = new CellProd(cell, 20);  
  11. CellCons cons = new CellCons(cell, 20);  
  12.  
  13. Thread producer = new Thread(new ThreadStart(prod.ThreadRun));  
  14. Thread consumer = new Thread(new ThreadStart(cons.ThreadRun));  
  15. //生產(chǎn)者線程和消費(fèi)者線程都已經(jīng)被創(chuàng)建,但是沒(méi)有開(kāi)始執(zhí)行  
  16. try  
  17. {  
  18. producer.Start( );  
  19. consumer.Start( );  
  20.  
  21. producer.Join( );  
  22. consumer.Join( );  
  23. Console.ReadLine();  
  24. }  
  25. catch (ThreadStateException e)  
  26. {  
  27. //當(dāng)線程因?yàn)樗帬顟B(tài)的原因而不能執(zhí)行被請(qǐng)求的操作  
  28. Console.WriteLine(e);  
  29. result = 1;  
  30. }  
  31. catch (ThreadInterruptedException e)  
  32. {  
  33. //當(dāng)線程在等待狀態(tài)的時(shí)候中止  
  34. Console.WriteLine(e);  
  35. result = 1;  
  36. }  
  37. //盡管Main()函數(shù)沒(méi)有返回值,但下面這條語(yǔ)句可以向父進(jìn)程返回執(zhí)行結(jié)果  
  38. Environment.ExitCode = result;  
  39. }  

在上面的例程中,同步是通過(guò)等待Monitor.Pulse()來(lái)完成的。首先生產(chǎn)者生產(chǎn)了一個(gè)值,而同一時(shí)刻消費(fèi)者處于等待狀態(tài),直到收到生產(chǎn)者的“脈沖(Pulse)”通知它生產(chǎn)已經(jīng)完成,此后消費(fèi)者進(jìn)入消費(fèi)狀態(tài),而生產(chǎn)者開(kāi)始等待消費(fèi)者完成操作后將調(diào)用Monitor.Pulese()發(fā)出的“脈沖 ”。

事實(shí)上,這個(gè)簡(jiǎn)單的例子已經(jīng)幫助我們解決了多線程應(yīng)用程序中可能出現(xiàn)的大問(wèn)題,只要領(lǐng)悟了解決線程間沖突的基本方法,很容易把它應(yīng)用到比較復(fù)雜的程序中去。以上介紹C#生產(chǎn)者和消費(fèi)者。

【編輯推薦】

  1. C#結(jié)構(gòu)體的特點(diǎn)淺析
  2. 介紹C#窗體拖動(dòng)事件
  3. C#讀取Excel遇到無(wú)法讀取的解決方法
  4. 概述C#.NET操作XML
  5. C#基礎(chǔ)概念學(xué)習(xí)筆記
責(zé)任編輯:佚名 來(lái)源: IT168
相關(guān)推薦

2015-08-26 09:39:30

java消費(fèi)者

2021-12-22 11:00:05

模型Golang語(yǔ)言

2024-03-14 11:58:43

2024-10-11 09:27:52

2012-02-14 12:31:27

Java

2017-05-16 12:30:21

Python多線程生產(chǎn)者消費(fèi)者模式

2021-08-31 10:26:24

存儲(chǔ)

2021-04-20 08:32:51

消息MQ隊(duì)列

2024-08-27 10:19:31

2021-12-28 12:01:59

Kafka 消費(fèi)者機(jī)制

2020-09-14 08:45:58

多線程模型面試

2023-06-01 08:08:38

kafka消費(fèi)者分區(qū)策略

2015-06-15 11:29:34

數(shù)據(jù)中心綠色數(shù)據(jù)中心

2022-07-07 09:00:49

RocketMQ消費(fèi)者消息消費(fèi)

2011-07-22 16:25:38

CA TechnoloIT消費(fèi)化

2011-08-05 16:21:24

2011-11-15 10:05:29

Kindle Fire平板市場(chǎng)

2009-04-15 11:17:23

2018-05-16 23:37:55

攜號(hào)轉(zhuǎn)網(wǎng)運(yùn)營(yíng)商網(wǎng)絡(luò)

2024-01-24 09:00:31

SSD訂閱關(guān)系內(nèi)存
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)