具體的需求是 在某一時間點只有N個線程在並發執行如果有多余的線程則排隊等候~ 還真是費盡心思啊~最終還是被我攻克了下面我就來說說具體的實現
C#提供了Mutex與Interlocked這兩個與線程相關的類都在Threading命名空間下! Mutex中提供了WiteOneReleaseMutex 兩個實例方法WiteOne的作用是阻塞當前線程提供對該線程的原子操作也就是說當一個線程遇到WiteOne的時候如果在WiteOne裡面沒有線程在操作則此線程進去操作而裡面有線程的時候所有到此的線程均需要排隊等候裡面的線程執行完畢而控制這樣操作的結束標記就是使用ReleaseMutex 方法!
就好比WiteOne是一把鎖一樣~而ReleaseMutex 就是一把鑰匙 當個人都看到這個門的時候第一個到達門口的人會看到屋子裡沒有人則他進去同時會把門鎖上後面的人自然要在門口等候當此人在屋子裡執行完任務後他會用鑰匙把門打開! 出去後把鎖交給門口排隊的第二位同志第二位同志再做同樣的操作 如果第一位同志執行完任務以後不把使用權交給第二個人的話而直接退出 那麼屋子自然就空了下來而門還是鎖的~不必擔心~門會自動打開只要是前一個人已經不在屋子裡即可~
然後再來說說這個Interlocked官方說明是對一個變量進行原子操作進行遞增或者遞減然後保存 原子操作的概念就是有且只有一個線程在對此變量進行操作~不准其他線程干預的操作 當對一個變量進行原子操作的時候此變量就會加鎖而其他線程是無法訪問的只能掛起等候此變量解鎖 我感覺實際上使用的也就是Mutex來實現的
好了開始說說具體的實現吧
public class MutexTest
{
private static int poolFlag = ;//標記
private const int amountThread = ;//線程總量
private const int maxThread = ;//可執行線程最大數量
private static Mutex muxConsole = new Mutex() ;
public static void Main()
{
for ( int i = ;i <amountThread ;i ++ )
{
// 創建指定數量的線程
// 是線程調用Run方法
// 啟動線程
Thread trd = new Thread( new ThreadStart( Run ) ) ;
trdName = 線程 + i ;
trdStart() ;
}
}
public static void Run()
{
muxConsoleWaitOne(); //阻塞隊列
InterlockedIncrement(ref poolFlag) ;//標記+
if (poolFlag != maxThread) //判斷是否等於上限
muxConsoleReleaseMutex(); //如果此線程達不到可執行線程上限則繼續開通讓後面的線程進來
ConsoleWriteLine( {} 正在運行 ThreadCurrentThreadName ) ;
ThreadSleep( ); //模擬執行
ConsoleWriteLine( {} 已經中止 ThreadCurrentThreadName ) ;
//標記
InterlockedDecrement(ref poolFlag) ;
}
}
From:http://tw.wingwit.com/Article/program/net/201311/14555.html