多線程技術,對於我來講,也正如荷花一樣,可遠觀而不可褻玩焉。為什么這么說呢,是因為很久以前就看過相關的博客以及書箱方面的介紹,但是一直在工作當中未嘗使用過。當然這次也不是工作需要用到,只是單純想學學多線程的使用方法,一來是加深對這方面知識的理解,二來是給大家拋磚引玉,三人行,必有我師焉。感覺自己一個人學,就像一個苦行僧,需要有很強的毅力才能成功。因為我不夠毅力:),所以希望與大家共同學習,共同進步,希望得到大家的指點。
談到多線程,有些概念性的東西可能需要再次被搬到紙面上來談。有程序、進程、線程等吧。
不過說來也可笑,對於概念的東西,確實沒什么吸引力,畢竟概念性的東西,讀起來總是感覺晦澀難懂。沒有實例來得簡單明了。所以這里面,大家想了解的話,可點擊網上詳細的介紹(摘自http://blog.chinaunix.net/uid-21843387-id-3029913.html)。
好了,其實不看概念也沒有關系拉,畢竟我們用的資源管理器(見下圖)來關程序或者是進程還用得少么。畢竟我們不是創造者,只是使用者。概念的東西是幫助我們去理解,而不是讓我們受惑。對於我來講,程序是一個電腦的入口。開啟了這一個入口之后,就能在電腦里面注冊激活它(進程)。它要做事情需要借助電腦的多種資源來完成(線程)。
撇開別的不說,多線程為什么這么受青睞。這點大家都懂,因為現在的電腦是多核的CPU。對於CPU來講,它的運行速度是很快的,但是其它設備的執行速度就很慢。就像短路運動接力一樣,一個人再快,其它幾個人不快也是白搭。所以對於單核CPU來講的話,多線程可能還不能完全發揮功力。但是對於多核CPU來講,那就不同了。多線程可以更有效地利用CPU資源,從而達到高效的目的。因為使用多線程技術,可以榨取CPU的休息(等待)時間。就像個老板一樣,讓工人拼命干活,保證多條流水線在同時進行生產。
好拉,仁者見仁,智者見智。下面我們來看看怎么在C#里面使用多線程的實例吧。
using System; using System.Threading; using System.Collections.Generic; public class Program { public static void Main(string[] args) { string content = "百川東到海,何時復西歸?少壯不努力,老大徒傷悲。"; //創建兩個線程,分別來顯示上面的一首詩 Thread firstThread = new Thread(new ParameterizedThreadStart(Read)); Thread lastThread = new Thread(new ParameterizedThreadStart(Read)); Data firstTwoData = new Data(); firstTwoData.Name = "First Thread"; firstTwoData.Content = content.Substring(0, 12); Data lastTwoData = new Data(); lastTwoData.Name = "Last Thread"; lastTwoData.Content = content.Substring(12, 12); firstThread.Start(firstTwoData); lastThread.Start(lastTwoData); //使用Join方法,則主線程需要等調用Join方法的線程完成后再往下執行 firstThread.Join(); lastThread.Join(); Console.WriteLine("處理完成,收工!"); //調用About方法,則終止線程 firstThread.Abort();
lastThread.Abort(); Console.ReadLine(); } public static void Read(object data) { Data model = data as Data; if (model != null) { //將當前線程阻塞2s Thread.Sleep(2000); Console.WriteLine(string.Format("Thread Name:[{0}], Content:[{1}]", model.Name, model.Content)); } } public class Data { public string Name{get;set;} public string Content{get;set;} } }
關於上面的實例,主要是介紹幾個常用的多線程方法,方法都是在System.Threading這個命名空間當中。
public Thread(ThreadStart start) |
多線程Thread類的構造函數,實例化這個類,即可創建一個多線程的實例。構造函數中的System.Threading.ThreadStart是一個委托,它表示此線程開始執行時要調用的方法。這里要調用的方法不可以有參數。
public Thread(ParameterizedThreadStart start) |
多線程Thread類的構造函數,實例化這個類,即可創建一個多線程的實例。構造函數中的System.Threading.ParameterizedThreadStart 是一個委托,它表示此線程開始執行時要調用的方法。這里要調用的方法只能帶一個參數。
//創建兩個線程,分別來顯示上面的一首詩 Thread firstThread = new Thread(new ParameterizedThreadStart(Read)); Thread lastThread = new Thread(new ParameterizedThreadStart(Read));
public static void Sleep(int millisecondsTimeout) |
多線程類調用這個方法,可以將當前線程掛起指定的時間。這是Thread類的靜態方法,使用比較簡單,只需要Thread.Sleep(毫秒時間)。
public void Start() |
多線程類調用這個方法,即意味着這個多線程正式啟動。調用這個方法,則意味着傳遞到多線程類的構造函數的委托是沒有參數,即是使用System.Threading.ThreadStart的委托
public void Start(object parameter) |
多線程類調用這個方法,即意味着這個多線程正式啟動。調用這個方法,則意味着傳遞到多線程類的構造函數的委托是需要參數的,即是使用System.Threading.ParameterizedThreadStart的委托
firstThread.Start(firstTwoData);
lastThread.Start(lastTwoData);
public void Join() |
多線程調用這個方法,即意味着在繼續執行標准的 COM 和 SendMessage 消息泵處理期間,阻塞調用線程,直到某個線程終止為止。說白了,就是調用這個方法的多線程之后要執行的指令需要等調用的多線程完成之后才能繼續執行。
對於上面的例子來講,由於兩個線程firstThread和lastThread都調用了Join()方法。所以Console.WriteLine("處理完成,收工!");需要等兩個線程firstThread和lastThread執行完成后,才能繼續執行下面的指令。
//使用Join方法,則主線程需要等調用Join方法的線程完成后再往下執行 firstThread.Join(); lastThread.Join(); Console.WriteLine("處理完成,收工!");
public void Abort() |
多線程調用這個方法,即可終止線程。
本文作為入門的學習資料,簡單介紹了多線程的常用使用方法。希望與大家一起學習。多線程技術是一門高深的技術,要使用得好,還是需要不斷深入地學習,希望以后還會繼續往這方面添磚加瓦。
至此本文完。