由二部分组成,一个线程管理类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<SPAN sty</summary>