使用背景
在C#.NET中,當需要動態控制線程的數量時,我們可以使用Semaphore來控制最大線程數。
關於Semaphore代碼示例
class Program
{
//Semaphore(初始授予0個請求數,設置最大可授予5個請求數)
static Semaphore semaphore = new Semaphore(0, 5);
static void Main(string[] args)
{
for (int i = 1; i <= 5; i++)
{
Thread thread = new Thread(work);
thread.Start(i);
}
Thread.Sleep(1000);
Console.WriteLine("Main方法結束");
//授予5個請求
semaphore.Release(5);
Console.ReadLine();
}
static void work(object obj)
{
semaphore.WaitOne();
Console.WriteLine("print: {0}", obj);
semaphore.Release();
}
}
運行結果如下:
![Semaphore]()
new Semaphore(0, 5);
構造函數第一個參數,表示我們還可使用的授權數。
第二個參數表示我們最大可申請的授權數。
當授權數用完時,則會造成線程阻塞直到可申請到Semaphore
的授權。所以如上代碼我一開始初始化了0
個授權數,所以沒有授權則會被阻塞。
在main
方法快運行完時,我使用代碼semaphore.Release(5);
授權了5
個請求。
這時還阻塞在semaphore.WaitOne();
的代碼得到授權則開始繼續往下運行,打印出print:{0}
。
小提示:semaphore.Release();
等同於 semaphore.Release(1);