程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> C#線程 在某一時間內,只有N個線程在並發執行,其余都在隊列中的實

C#線程 在某一時間內,只有N個線程在並發執行,其余都在隊列中的實

編輯:關於C#
 

具體的需求是 在某一時間點,只有N個線程在並發執行,如果有多余的線程,則排隊等候~

還真是費盡心思啊~最終還是被我攻克了~

下面我就來說說具體的實現

C#提供了Mutex與Interlocked這兩個與線程相關的類,都在Threading命名空間下~!

Mutex中提供了WiteOne,ReleaseMutex 兩個實例方法~

WiteOne的作用是"阻塞當前線程,提供對該線程的原子操作"

也就是說當一個線程遇到WiteOne的時候,如果在WiteOne裡面沒有線程在操作,則此線程進去操作

而裡面有線程的時候,所有到此的線程均需要排隊等候裡面的線程執行完畢~

而控制這樣操作的結束標記就是使用ReleaseMutex 方法!

就好比WiteOne是一把鎖一樣~而ReleaseMutex 就是一把鑰匙

當10個人都看到這個門的時候,第一個到達門口的人會看到屋子裡沒有人,則他進去,同時會把門鎖上~

後面的人自然要在門口等候,當此人在屋子裡執行完任務後他會用鑰匙把門打開!

出去後把鎖交給門口排隊的第二位同志,第二位同志再做同樣的操作

如果第一位同志執行完任務以後不把使用權交給第二個人的話,而直接退出

那麼屋子自然就空了下來,而門還是鎖的~不必擔心~門會自動打開,只要是前一個人已經不在屋子裡即可~

 

然後再來說說這個Interlocked,官方說明是"對一個變量進行原子操作進行遞增或者遞減然後保存"

原子操作的概念就是,有且只有一個線程在對此變量進行操作~不准其他線程干預的操作

當對一個變量進行原子操作的時候,此變量就會加鎖,而其他線程是無法訪問的,只能掛起等候此變量解鎖

我感覺實際上使用的也就是Mutex來實現的

 

好了開始說說具體的實現吧

public class MutexTest
{
private static int poolFlag = 0 ;//標記
private const int amountThread = 10 ;//線程總量
private const int maxThread = 3 ;//可執行線程最大數量
private static Mutex muxConsole = new Mutex() ;

public static void Main()
{
for ( int i = 0 ; i < amountThread ; i ++ )
{
// 創建指定數量的線程
// 是線程調用Run方法
// 啟動線程
Thread trd = new Thread( new ThreadStart( Run ) ) ;
trd.Name = "線程" + i ;
trd.Start() ;
}
}

public static void Run()
{

muxConsole.WaitOne(); //阻塞隊列
Interlocked.Increment(ref poolFlag) ; //標記+1
if (poolFlag != maxThread) //判斷是否等於上限
muxConsole.ReleaseMutex(); //如果此線程達不到可執行線程上限,則繼續開通,讓後面的線程進來
Console.WriteLine( "{0} 正在運行....../n", Thread.CurrentThread.Name ) ;
Thread.Sleep( 5000 ); //模擬執行
Console.WriteLine( "{0} 已經中止....../n", Thread.CurrentThread.Name ) ;

//標記-1
Interlocked.Decrement(ref poolFlag) ;
}
}

 

注釋很全,大家慢慢看吧~我准備把這個用到WebService的負載平衡上面~

這樣我就可以自己控制請求的數量了~

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved