最近跟朋友聊到有關多執行緒的問題,才發現隨著程式撰寫的角度,從最早期剛開始會寫程式時的一個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行:印出110

 

二、可傳一個值的方法

這個方法跟上一個方法沒什麼太大的改變,只是把委託物件由原本的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行:印出1Number

 

三、可傳多個值的方法

最後一種可以傳多個值的方法,其實是使用第一種方法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使用率等效用。雖然這種多執行緒的解法,存在著部份負評,但那大多考量到的是資源共享所帶來的競爭與同步的問題,不可否認的是在撇去競爭問題,它仍然是改善程式效率避免衝突的一大解答。

好了,以上是小弟個人關於多執行緒程式的方法,給大家參考,如有誤人子弟之處,還請各位先進給予指教。

如果覺得本篇文章對你有幫助的話,也請別忘記按讚加留言給予鼓勵喔。

arrow
arrow

    zhong.jun.jimmy 發表在 痞客邦 留言(0) 人氣()