多線程技術,對於我來說,也正如荷花同樣,可遠觀而不可褻玩焉。爲何這麼說呢,是由於好久之前就看過相關的博客以及書箱方面的介紹,可是一直在工做當中何嘗使用過。固然此次也不是工做須要用到,只是單純想學學多線程的使用方法,一來是加深對這方面知識的理解,二來是給你們拋磚引玉,三人行,必有我師焉。感受本身一我的學,就像一個苦行僧,須要有很強的毅力才能成功。由於我不夠毅力:),因此但願與你們共同窗習,共同進步,但願獲得你們的指點。html
談到多線程,有些概念性的東西可能須要再次被搬到紙面上來談。有程序、進程、線程等吧。多線程
不過說來也好笑,對於概念的東西,確實沒什麼吸引力,畢竟概念性的東西,讀起來老是感受晦澀難懂。沒有實例來得簡單明瞭。因此這裏面,你們想了解的話,可點擊網上詳細的介紹(摘自http://blog.chinaunix.net/uid-21843387-id-3029913.html)。函數
好了,其實不看概念也沒有關係拉,畢竟咱們用的資源管理器(見下圖)來關程序或者是進程還用得少麼。畢竟咱們不是創造者,只是使用者。概念的東西是幫助咱們去理解,而不是讓咱們受惑。對於我來說,程序是一個電腦的入口。開啓了這一個入口以後,就能在電腦裏面註冊激活它(進程)。它要作事情須要藉助電腦的多種資源來完成(線程)。學習
撇開別的不說,多線程爲何這麼受青睞。這點你們都懂,由於如今的電腦是多核的CPU。對於CPU來說,它的運行速度是很快的,可是其它設備的執行速度就很慢。就像短路運動接力同樣,一我的再快,其它幾我的不快也是白搭。因此對於單核CPU來說的話,多線程可能還不能徹底發揮功力。可是對於多核CPU來說,那就不一樣了。多線程能夠更有效地利用CPU資源,從而達到高效的目的。由於使用多線程技術,能夠榨取CPU的休息(等待)時間。就像個老闆同樣,讓工人拼命幹活,保證多條流水線在同時進行生產。ui
好拉,仁者見仁,智者見智。下面咱們來看看怎麼在C#裏面使用多線程的實例吧。spa
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這個命名空間當中。.net
public Thread(ThreadStart start) |
多線程Thread類的構造函數,實例化這個類,便可建立一個多線程的實例。構造函數中的System.Threading.ThreadStart是一個委託,它表示此線程開始執行時要調用的方法。這裏要調用的方法不能夠有參數。線程
public Thread(ParameterizedThreadStart start) |
多線程Thread類的構造函數,實例化這個類,便可建立一個多線程的實例。構造函數中的System.Threading.ParameterizedThreadStart 是一個委託,它表示此線程開始執行時要調用的方法。這裏要調用的方法只能帶一個參數。unix
//建立兩個線程,分別來顯示上面的一首詩 Thread firstThread = new Thread(new ParameterizedThreadStart(Read)); Thread lastThread = new Thread(new ParameterizedThreadStart(Read));
public static void Sleep(int millisecondsTimeout) |
多線程類調用這個方法,能夠將當前線程掛起指定的時間。這是Thread類的靜態方法,使用比較簡單,只須要Thread.Sleep(毫秒時間)。code
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() |
多線程調用這個方法,便可終止線程。
本文做爲入門的學習資料,簡單介紹了多線程的經常使用使用方法。但願與你們一塊兒學習。多線程技術是一門高深的技術,要使用得好,仍是須要不斷深刻地學習,但願之後還會繼續往這方面添磚加瓦。
至此本文完。