线程池
2007-10-31 23:54 Animax! 阅读(381) 评论(0) 编辑 收藏 举报
线程池的使用和设置:
由于线程是在System.Threading 命名空间下,所以,首先需要引用这个命名空间。
ThreadPool 是一个静态对象。表示系统只提供你一个线程池
主要在需要多个线程处理简单过程时使用 。
要使用线程池也很简单方面,只需要用QueueUserWorkItem 方法即可。
要把一些参数值传入线程池中的线程也很方便。
在默认情况下, 线程池的最大线程个数为 25 个。
就是说,如果你线程池里面有已经有25个线程在运行了,但是还需要再申请线程,那么线程池将不会响应,并返回false 。
可以通过 SetMaxThreads 过程设置线程池最大线程数量。
也可以使用 SetMinThreads 设置最小线程数量。
同样GetMaxThreads 和 GetMinThreads 可以获取最大线程数和最小线程数量。
线程池与线程同步:
方法是在建立线程的时候传入一个ManualResetEvent事件用于通知线程,线程池内的线程是否已经完成工作。
示例代码 :
在 事件.WaitOne() 这里,主线程将会睡眠等待 事件 的响应。
事件 在这里就像一个开关。
顺面记录下:
使用多线程访问资源 , 一定要用 System.Threading.Monitor
System.Threading.Monitor.Enter(对象) // 获取在此对象上的排它锁 ,如果不能获取排它锁即等待。
System.Threading.Monitor.Pulse(); // 通知其他在等待的线程排它锁状态更改。
System.Threading.Monitor.Exit();. // 释放在此对象上的排它锁
由于线程是在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 }
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();. // 释放在此对象上的排它锁