最近跟朋友聊到有關多執行緒的問題,才發現隨著程式撰寫的角度,從最早期剛開始會寫程式時的一個Main到底,後來的開始有物件導向的概念,會開始把程式裡重複使用的功能寫成Function,接著遇到了需要使用多執行緒的時候,在正規課程中幾乎大部分的人都只有在”作業系統”一門課中聽過多執行緒,也確實有不少人程式寫很久,都碰不到多執行緒的問題,但今天還是想來分享並記錄一下有關我使用Threading撰寫多執行緒程式的方法。
此單元需要
using System.Threading
大綱:
一、基本多執行緒呼叫方法(不可傳值)
二、可傳一個值的方法
三、可傳多個值的方法
一、基本多執行緒呼叫方法(不可傳值)
建立一個執行緒,並傳入一個委派物件 ThreadStart,將其指向指定的方法。如下方程式碼,即是指向名為countOne2Ten的方法:
//ThreadStart
Thread threadCount = new Thread(new ThreadStart(countOne2Ten));
threadCount.Start();
public void countOne2Ten()
{
for (int i = 1; i <= 10; i++)
{
Console.Write("1數到10:");
Console.WriteLine(i);
}
}
程式碼說明:
2行:建立一個執行緒,並且傳入一個委派物件 ThreadStart,並且指向countOne2Ten。
7-11行:印出1到10。
二、可傳一個值的方法
這個方法跟上一個方法沒什麼太大的改變,只是把委託物件由原本的ThreadStart改成了ParameterizedThreadStart,如同它的名稱” Parameter”一樣,它可以用來傳遞參數,但缺點是僅能傳一個參數,且Type必須為object,在使用上仍然有一點不方便,以下我改寫了上方的例子,呈現ParameterizedThreadStart物件的使用方法。
//parameterizedthreadstart Thread threadCount2Num = new Thread(new ParameterizedThreadStart(countOne2Num)); threadCount2Num.Start(10); public void countOne2Num(object value) { int Number = Convert.ToInt32(value); for (int i = 1; i <= Number; i++) { Console.Write("1數到" + Number + ":"); Console.WriteLine(i); } }
程式說明:
2行:建立一個執行緒,並傳入一個委派物件 ParameterizedThreadStart,將其指向countOne2Num。
7行:將object物件轉成int
8-12行:印出1到Number
三、可傳多個值的方法
最後一種可以傳多個值的方法,其實是使用第一種方法ThreadStart再加以改良,簡單的說就是寫一個Class,利用Get/Set的方式,來傳遞參數。如下程式碼:
Math math = new Math(); math.num1 = 10; math.num2 = 5; Thread threadAdd = new Thread(math.Add); threadAdd.Start(); //Class class Math { public double num1 { get; set; } public double num2 { get; set; } public void Add() { Console.Write(num1 + "+" + num2+"="); Console.WriteLine(num1 + num2); } }
程式說明:
1行:宣告Class
2-3行:傳遞參數
5行:建立一個執行緒,並傳入一個委派物件 ThreadStart,將其指向math.Add。
藉由最後一種方法,可以傳遞較多的參數,三種方法都刻有它的好處,但重點是Threading真的超好用,大大減少我們撰寫多執行緒程式時困擾。
雖然現在大部分的電腦都已經支援到了好多核心好多緒,但其實大多數的軟體都並不支援多執行緒,這會遇到的最主要問題就是單一執行緒過載的問題,所以撰寫多執行緒程式,除了可以把佔據時間較長的程序,放到後台去執行之外,也有平衡負載;充分利用CPU資源以及提高CPU使用率等效用。雖然這種多執行緒的解法,存在著部份負評,但那大多考量到的是資源共享所帶來的競爭與同步的問題,不可否認的是在撇去競爭問題,它仍然是改善程式效率避免衝突的一大解答。
好了,以上是小弟個人關於多執行緒程式的方法,給大家參考,如有誤人子弟之處,還請各位先進給予指教。
如果覺得本篇文章對你有幫助的話,也請別忘記按讚加留言給予鼓勵喔。
留言列表