使用背景
在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 ();
}
}
运行结果如下:
new Semaphore(0, 5);
构造函数第一个参数,表示我们还可使用的授权数。 第二个参数表示我们最大可申请的授权数。
当授权数用完时,则会造成线程阻塞直到可申请到Semaphore
的授权。所以如上代码我一开始初始化了0
个授权数,所以没有授权则会被阻塞。
在main
方法快运行完时,我使用代码semaphore.Release(5);
授权了5
个请求。 这时还阻塞在semaphore.WaitOne();
的代码得到授权则开始继续往下运行,打印出print:{0}
。
小提示:semaphore.Release();
等同于 semaphore.Release(1);