天天看點

多線程程式設計實戰(一)

為了快速處理大量的任務,多線程程式設計必不可少,是以最近也開始研究多線程方面的東西了。網上有不少資料可以參考,自己從執行個體入手,總結了一些東西,把它記錄下來,友善自己日後查閱,也友善後來人。現在的程式設計語言,入門第一課,都是寫一個Hello Word的程式。本文類似,雖說不是hello Word,但也是從最簡單的多線程執行個體入手。

我們最常用到多線程的場景一般是這樣的,有一個很大的任務需要處理,而這個大的任務有可以細分為許多的小任務(子任務),這些小任務可以采用多線程機制,并行執行。而一般來說,這個大任務所包含的小任務的個數可能不是太确定。

根據以上場景,我們對其進行歸納:

1. 一個大任務,内部包含了數量不定的子任務

2. 需要對子任務進行多線程處理

OK, 下面我們開始着手用C#實作對此執行個體的多線程實作。我的解決方案是:

1. 對象化大任務,在初始化大任務的執行個體(Instance)時,初始化(确定)子任務

2. 采用多線程,調用(Invoke)大任務的執行個體(Instance)中定義的處理子任務的方法

3. 多線程處理子任務時,定義一個全局的标志,記錄但前處理到了哪一個,保證不重複處理子任務;

基于此方案,我們的“大任務”類如下:

<a href="http://www.cnblogs.com/images/cnblogs_com/skywind/WindowsLiveWriter/06bfd4b53668_78A5/clip_image002_4.jpg"></a>

外部多線程實作如下:

<a href="http://www.cnblogs.com/images/cnblogs_com/skywind/WindowsLiveWriter/06bfd4b53668_78A5/clip_image004_2.jpg"></a>

在Console模式下,其結果顯示如下:

<a href="http://www.cnblogs.com/images/cnblogs_com/skywind/WindowsLiveWriter/06bfd4b53668_78A5/clip_image006_2.jpg"></a>

由此可見,線程3、4、5、6共4個線程一起處理了這些子任務。代碼不是很複雜,隻做簡單說明:

1. 預設的命名空間為System.Threading, 線程相關的東西都在這個namespace下;

2. new Random((int)DateTime.Now.Ticks).Next(30, 50):初始化一個随機數的執行個體(instance),然後生産一個在30到50之間的随機數。這裡的目的是假設我們在初始化任務執行個體時,不确定子任務的個數。後面還有new Random((int)DateTime.Now.Ticks).Next(100, 300),目的是架設處理子任務的時間在100到300毫秒之間不定

3. Thread th = new Thread(new ThreadStart(tester.TestOutput)); 

th.Start(); 這兩句可是線程程式設計的核心,即初始化一個線程執行個體,然後開始執行!

4. Thread.CurrentThread.GetHashCode():這個可以傳回線程的一個哈希值(HashCode),此例中沒有實際意義,隻用于區分不同的線程

5. private int flag = 0:作為一個标記使用,記錄但前執行到那個子任務了。各個子線程均能夠通路到。

6. public int MaxOutPut:記錄總的任務數。

Console.Write(“Hello Word”) J 一個簡單的多線程執行個體就是這麼easy,當然,這隻是最簡單、最初步的一個執行個體,還有很多需要注意、優化的東西,也有一些bug,我們下文接着說。

本文轉自Jack Niu部落格園部落格,原文連結:http://www.cnblogs.com/skywind/archive/2008/10/30/1322667.html,如需轉載請自行聯系原作者