日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#线程 在某一时间内,只有N个线程在并发执行,其余都在队列中的实现(转载)...

發布時間:2023/12/15 C# 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#线程 在某一时间内,只有N个线程在并发执行,其余都在队列中的实现(转载)... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

具體的需求是 在某一時間點,只有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的負載平衡上面~

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

轉載于:https://www.cnblogs.com/sandea/p/3293709.html

總結

以上是生活随笔為你收集整理的C#线程 在某一时间内,只有N个线程在并发执行,其余都在队列中的实现(转载)...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。