自定义线程池-c#的简单实现

由二部分组成,一个线程管理类ThreadManager,一个线程类MyThread
Test类是用来测试的

参考了以下资料:
http://tech.ccidnet.com/pub/disp/Article?columnID=294&articleID=33440&pageNO=1
http://soft.yesky.com/SoftChannel/72342371961929728/20041013/1863707.shtml

下面是代码,希望大家提出更好的建议:

1.ThreadManager.cs

using System;

using System.Threading;

using System.Collections;

namespace CustomThreadPool

{

///

1<summary>
2
3///  线程管理器,会开启或唤醒一个线程去执行指定的回调方法 
4
5///  </summary>

public class ThreadManager

{

private static ArrayList threadList = new ArrayList(); // 线程列表,静态

// 不允许创建实例

private ThreadManager()

{

}

///

1<summary>
2
3///  静态方法,开启或唤醒一个线程去执行指定的回调方法 
4
5///  </summary>

///

1<param name="waitCallback"/>

委托实例

///

1<param name="obj"/>

传递给回调方法的参数

///

1<param name="timeOut"/>

当没有可用的线程时的等待时间,以毫秒为单位

///

1<returns></returns>

public static bool QueueUserWorkItem(WaitCallback waitCallback, Object obj, int timeOut)

{

// 锁住共享资源,实现线程安全

lock (threadList)

{

try

{

// 如果线程列表为空,填充线程列表

if (threadList.Count == 0)

{

InitThreadList();

}

long startTime = DateTime.Now.Ticks;

do

{

// 遍历线程列表,找出可用的线程

foreach (MyThread myThread in threadList)

{

// 线程为空,需要创建线程

if (myThread.T == null )

{

myThread.Start(waitCallback, obj, false );

return true ;

}

else if (myThread.T.ThreadState == ThreadState.Suspended)

{ // 线程为挂起状态,唤醒线程

myThread.Start(waitCallback, obj, true );

return true ;

}

}

// 在线程 Sleep 前释放锁

Monitor.PulseAll(threadList);

Thread.Sleep(500);

} while (((DateTime.Now.Ticks - startTime) / 10000) < timeOut);

}

finally

{

Monitor.Exit(threadList);

}

}

return false ;

}

// 使用 MyThread 对象填充线程列表,注意,这个时候线程并没有启动

private static void InitThreadList()

{

threadList = new ArrayList();

for ( int i = 0; i < 10; i++)

{

MyThread t = new MyThread();

threadList.Add(t);

}

}

}

}

2.MyThread.cs

using System;

using System.Threading;

namespace CustomThreadPool

{

///

1<summary>
2
3///  封装  .NET  框架提供的  Thread 
4
5///  </summary>

internal class MyThread

{

private Thread t; // 线程

private WaitCallback w; // 委托,这里直接用 .NET 框架自带的,也可以根据需要自己定义一个

private Object o; // 传递给符合委托的回调方法的参数值,根据委托的定义而定

///

1<summary>
2
3///  执行回调方法的线程 
4
5///  </summary>

public Thread T

{

get

{

return t;

}

}

public MyThread()

{

}

///

1<summary>
2
3///  开启新线程或唤醒线程,去执行回调方法 
4
5///  </summary>

///

1<param name="w"/>

用回调方法实例化了的委托实例

///

1<param name="o"/>

传递给回调方法的参数值

///

1<param name="isSuspend"/>

true 表示线程为挂起状态, false 则表示线程还没创建

public void Start(WaitCallback w, Object o, bool isSuspend)

{

// 开启新线程或唤醒线程前,先设置

this .w = w;

this .o = o;

// 线程为挂起状态,唤醒线程继续执行

if (isSuspend)

{

t.Resume();

}

else

{ // 线程还没有创建,创建一个新线程,并执行

t = new Thread( new ThreadStart( this .ThreadProc));

t.Start();

}

}

///

1<summary>
2
3///  线程执行的方法 
4
5&lt;SPAN sty</summary>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus