C 多執行緒程式設計(1) 執行緒的啟動

2021-06-06 22:52:23 字數 4173 閱讀 3284

[c-sharp]view plain

copy

print?

usingsystem;  

usingsystem.collections.generic;  

usingsystem.text;  

usingsystem.threading;  

namespacestartthread  

/// 

/// 不帶引數的啟動方法

/// 

public

voidnonparameterrun()  

}  }  

程式的執行效果我們不用執行也會知道,那就是在迴圈中將系統當前時間的毫秒部分輸出出來,在每次輸出之後會將當前執行緒暫停一下,直到10次之後執行完畢,終止執行緒的執行。

在上面的**中我們是通過定義全域性變數的方法來指定執行緒暫停間隔,按照這種方法,假如要執行10個執行緒,每個執行緒的暫停間隔不一樣的話,就需要定義10個全域性變數,雖然最終不影響系統的執行效果,但是總覺得不是太爽。

有沒有比較簡單一點的辦法呢?有!那就是使用帶引數的啟動方法。

帶引數的啟動方法

如果要在例項化執行緒時要帶一些引數,就不能用threadstart委託作為建構函式的引數來例項化thread了,而要parameterizedthreadstart委託,和threadstart一樣的是它也是執行緒啟動時要執行的方法,和threadstart不同的是,它在例項化時可以用乙個帶有乙個object引數的方法作為建構函式的引數,而例項化threadstart時所用到的方法是沒有引數的。

為什麼是object這樣的引數呢?很簡單,因為在.net中object是所有型別的基類,用它可以表示array(陣列)、inte***ce(介面)、valuetype(值型別,如bool,byte,char,short,int,float,long,double等)、class(類)等.net中的型別。當然,這也意味著如果你要啟動乙個執行緒,給它傳遞乙個int型別引數時,必須在啟動方法中進行相應的型別轉換。

下面就是乙個例子,在啟動執行緒時指定了執行緒的暫停間隔,**如下:

[c-sharp]view plain

copy

print?

usingsystem;  

usingsystem.collections.generic;  

usingsystem.text;  

usingsystem.threading;  

namespacestartthread  

/// 

/// 帶引數的啟動方法

/// 

/// 讓執行緒在執行過程中的休眠間隔

public

voidparameterrun(objectms)  

}  }  }  

在這個方法裡,我們在啟動執行緒時順便指定了執行緒的暫停間隔,也就是這句:

parameterthread.start(30);

執行緒啟動時執行的方法是public void parameterrun(object ms),這個值為30的int型別變數被裝箱成object,所以在方法中還需要將它轉換成int型別,這個可以通過拆箱或者其它辦法解決。

假如我們要啟動兩個執行緒,每個執行緒的暫停間隔不一樣,啟動**如下:

[c-sharp]view plain

copy

print?

usingsystem;  

usingsystem.collections.generic;  

usingsystem.text;  

usingsystem.threading;  

namespacestartthread  

/// 

/// 帶引數的啟動方法

/// 

/// 讓執行緒在執行過程中的休眠間隔

public

voidparameterrun(objectms)  

}  }  }  

對上面的**做一點說明,就是執行緒啟動之後,執行緒的例項不必再存在,例如在上面的**中我用的是同乙個例項例項化了兩個執行緒,並且這兩個執行緒執行很正常。

繼續探索

[c-sharp]view plain

copy

print?

usingsystem;  

usingsystem.collections.generic;  

usingsystem.text;  

usingsystem.threading;  

namespacestartthread  

}  /// 

/// 執行緒的暫停間隔

/// 

public

intinterval  

}  /// 

/// 建構函式

/// 

/// 執行緒的暫停間隔

/// 迴圈次數

publicmythreadparameter(intinterval,intloopcount)  

}  classprogram  

/// 

/// 帶多個引數的啟動方法

/// 

/// 方法引數

public

voidmyparameterrun(objectms)  

}  }  }  

}  

[c-sharp]view plain

copy

print?

usingsystem;  

usingsystem.collections.generic;  

usingsystem.text;  

usingsystem.threading;  

namespacestartthread  

public

voidstart()  

}  private

voidrun()  

}  }classprogram  

}  }  

上面的**的執行效果和前面的**執行效果類似,只不過是將業務處理**放在乙個單獨的類mythreadparameter中,使得mythreadparameter看起來也像乙個thread,實際上維護的還是其內部的thread,在一些大型系統中這樣做的好處是便於維護。

總結:在本篇主要講述如何啟動執行緒的問題,在啟動時可能會遇到無需引數、需要多個引數的情況,在這裡講述了如何解決這些問題的思路。在.net類庫中雖然存在著龐大的類庫,但是並不是總會有合適的類來解決我們所遇到的問題,但是只要肯動腦筋總會想到合適的辦法。

C 多執行緒程式設計(1) 執行緒的啟動

在例項化thread的例項,需要提供乙個委託,在例項化這個委託時所用到的引數是執行緒將來啟動時要執行的方法。在.net中提供了兩種啟動執行緒的方式,一種是不帶引數的啟動方式,另一種是帶引數的啟動的方式。不帶引數的啟動方式 如果啟動引數時無需其它額外的資訊,可以使用threadstart來例項化thr...

C 多執行緒程式設計(1) 執行緒的啟動

在例項化thread的例項,需要提供乙個委託,在例項化這個委託時所用到的引數是執行緒將來啟動時要執行的方法。在.net中提供了兩種啟動執行緒的方式,一種是不帶引數的啟動方式,另一種是帶引數的啟動的方式。不帶引數的啟動方式 如果啟動引數時無需其它額外的資訊,可以使用threadstart來例項化thr...

C 多執行緒程式設計(1) 執行緒的啟動

在例項化thread的例項,需要提供乙個委託,在例項化這個委託時所用到的引數是執行緒將來啟動時要執行的方法。在.net中提供了兩種啟動執行緒的方式,一種是不帶引數的啟動方式,另一種是帶引數的啟動的方式。不帶引數的啟動方式 如果啟動引數時無需其它額外的資訊,可以使用threadstart來例項化thr...