熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

C#多線程學習—生產者和消費者(3)

2022-06-13   來源: .NET編程 

    下面定義生產者類 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

    事實上這個簡單的例子已經幫助我們解決了多線程應用程序中可能出現的大問題只要領悟了解決線程間沖突的基本方法很容易把它應用到比較復雜的程序中去


From:http://tw.wingwit.com/Article/program/net/201311/15265.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.