代码改变世界

线程池

2007-10-31 23:54  Animax!  阅读(381)  评论(0编辑  收藏  举报
线程池的使用和设置:
由于线程是在System.Threading 命名空间下,所以,首先需要引用这个命名空间。

ThreadPool  是一个静态对象。表示系统只提供你一个线程池
主要在需要多个线程处理简单过程时使用 。

要使用线程池也很简单方面,只需要用QueueUserWorkItem 方法即可。
ThreadPool.QueueUserWorkItem( /* 使用线程的过程 */ ); 

要把一些参数值传入线程池中的线程也很方便。
ThreadPool.QueueUserWorkItem( 使用线程的过程 , (object)参数值); 

在默认情况下, 线程池的最大线程个数为 25 个。
就是说,如果你线程池里面有已经有25个线程在运行了,但是还需要再申请线程,那么线程池将不会响应,并返回false 。

可以通过 SetMaxThreads 过程设置线程池最大线程数量。
也可以使用 SetMinThreads 设置最小线程数量。

同样GetMaxThreads 和 GetMinThreads 可以获取最大线程数和最小线程数量。


线程池与线程同步:
方法是在建立线程的时候传入一个ManualResetEvent事件用于通知线程,线程池内的线程是否已经完成工作。

示例代码 :
 1     class Main
 2     {
 3         void Main()
 4         {
 5             ManualResetEvent 事件= new ManualResetEvent(false); // 决定标识
 6             线程 线程= new 线程(/* 传入处理的值 */,事件);
 7             ThreadPool.QueueUserWorkItem(线程.操作);  
 8             事件.WaitOne();
 9            // 使用 线程. 返回值 的值
10         }
11     }
12     class 线程
13     {
14         ManualResetEvent 线程事件;
15         private object 参数值;
16 
17         public 线程(object 值, ManualResetEvent 事件)
18         {
19             线程事件= 事件;
20             参数值= 值;
21         }
22 
23         public void 操作(object 无用的)
24         {
25             // 工作代码
26             线程事件.Set(); //通知外部,完成工作
27         }
28 
29         public string 返回值
30         {
31             get { return 参数值; }
32         }
33 }



在 事件.WaitOne() 这里,主线程将会睡眠等待 事件 的响应。
事件 在这里就像一个开关。


顺面记录下:
使用多线程访问资源 , 一定要用 System.Threading.Monitor
            System.Threading.Monitor.Enter(对象)  // 获取在此对象上的排它锁 ,如果不能获取排它锁即等待。
            System.Threading.Monitor.Pulse();     // 通知其他在等待的线程排它锁状态更改。
            System.Threading.Monitor.Exit();.      // 释放在此对象上的排它锁