C#中隊列集合的用法,配合線程

來源:互聯網
上載者:User
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading;
  6. namespace 集合
  7. {
  8.     class 隊列
  9.     {
  10.         public static void Main()
  11.         { 
  12.             //隊列: 元素以先進先出的方式來處理的集合(FIFO-First In First Out)第一個來,第一個滾
  13.             //例:飛機登記排隊,靠前的就先上飛要,不過隊列有優先順序,如商務倉的隊與經濟倉的隊,是兩個不同的隊,而商務優先
  14.             //在.Net技術中,      using System.Collections.Generic.Queue<T>是隊列的泛型版本實現
  15.             // System.Collections.Queue是非泛型的實現,參數是Object
  16.             //public class Queue<T> : IEnumerable<T>, ICollection, IEnumerable
  17.             //從隊列的定義可以看出,它實現了跌代,集合介面 ,它沒有實現ICollection<T>這個介面,因為其中定義的Add Remove方法會破壞隊列
  18.             //隊列與列表主要區別就是在於,它沒有實現IList介面
  19.             //所以,不可以用索引器訪問隊列,隊列只允許添加元素,該元素只能放在隊列的最後(Enqueue()),還有就是從頭部取元素Dequeue()
  20.             //Enqueue從隊列的後面插入元素,而 Dequeue在取一個元素的同時,會前取出的元素刪除,如再再調用一次,就刪除下一個元素
  21.             
  22.             //方法簡介 :
  23.             // Enqueue() 一端插入元素
  24.             // Dequeue() 從頭部讀取和刪除一個元素,如果調用方法時,隊列中沒有元素,刨出InvalidOperationException異常
  25.             // Peek() 在隊列頭部讀取一個元素,但是,不刪除它
  26.             // Count 返回隊列元素個數
  27.             // TrimExcess() 重新設定隊列容量,Dequeue方法,是可能刪除一個對象,但是,不會重設容量,這樣會浪費空餘空間 ,本方法,從頭部清除空餘空間
  28.             // Contains() 確定某個元素是不是在隊列中,如果是,返回true
  29.             // CopyTo() 把元素從隊列複製到一個已有的數組中 
  30.             // ToArray() 返回一個包含隊列元素的新數組
  31.             // 下面我們開始寫一個關於隊列的例子, 使用一個線程將文檔添加到隊列中,用另一個線程讀取隊列,並處理他們
  32.             // 儲存隊列的類型是Document,我們先定義一個文檔類,接著定義一個文檔處理類DocumentManager,其中包含了添加與讀取方法,還有一個屬性確定隊列中是不是為空白
  33.             // 然後我們定義一個 ProcessDocuments來處理線程,操作文檔
  34.            
  35.             DocumentManager mg = new DocumentManager();
  36.             ProcessDocuments prcess = new ProcessDocuments( mg );
  37.             //啟動讀取線程,不過現在沒內容,要等一會加入後,就能讀到了
  38.             ProcessDocuments.Start(mg);
  39.             Document doc = null;
  40.             for (int i = 0; i < 500; i++)
  41.             {
  42.                 doc = new Document("Aladdin:" + i, "Hello,Nihao!");
  43.                 mg.AddDocument( doc );
  44.                 //睡會,讓給其他線程玩會
  45.                 //Thread.Sleep(20);
  46.             }
  47.             Console.ReadLine();
  48.         }
  49.     }
  50.     
  51.     // 文檔類,描述了文檔的標題與內容
  52.     class Document
  53.     {
  54.         public string title;
  55.         public string content;
  56.         public Document(string title, string content)
  57.         {
  58.             this.title = title;
  59.             this.content = content;
  60.         }
  61.     }
  62.     class DocumentManager
  63.     {
  64.         //定義隊列集合
  65.         private readonly Queue<Document> docQueue = new Queue<Document>();
  66.         
  67.         //添加文檔
  68.         public void AddDocument(Document doc)
  69.         {
  70.             lock (this)
  71.             {
  72.                 //從隊列一端插入內容
  73.                 docQueue.Enqueue(doc);
  74.                 Console.WriteLine( "成功插入文檔:" + doc.title);
  75.             }
  76.         }
  77.         
  78.         //讀取文檔
  79.         public Document GetDocument()
  80.         {
  81.             Document doc = null;
  82.             lock (this)
  83.             {
  84.                 doc = docQueue.Dequeue();
  85.                 return doc;
  86.             }
  87.         }
  88.         //唯讀屬性,確定隊列中是不是還有元素
  89.         public bool IsDocumentAvailable
  90.         {
  91.             get
  92.             {
  93.                 return docQueue.Count > 0;
  94.             }
  95.         }
  96.     }
  97.     // 處理文檔
  98.     class ProcessDocuments
  99.     {
  100.         private DocumentManager dm;
  101.         public ProcessDocuments( DocumentManager dm )
  102.         {
  103.             this.dm = dm;
  104.         }
  105.         public static void Start(DocumentManager manager)
  106.         { 
  107.             // 參數 : public delegate void ThreadStart();
  108.             new Thread(new ProcessDocuments(manager).DoThreadFunc).Start() ;
  109.         }
  110.         public void DoThreadFunc()
  111.         { 
  112.             //無限迴圈讀取,只要隊列中有內容,這條線程就讀出來
  113.             while (true)
  114.             {
  115.                 if (this.dm.IsDocumentAvailable)
  116.                 {
  117.                     Document doc = this.dm.GetDocument() ;
  118.                     Console.WriteLine("從隊列中讀到讀取並刪除文檔 標題:{0}   內容: {1}", doc.title, doc.content );
  119.                 }
  120.             }
  121.         }
  122.     }
  123. }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.