.NET开发

本类阅读TOP10

·NHibernate快速指南(翻译)
·vs.net 2005中文版下载地址收藏
·【小技巧】一个判断session是否过期的小技巧
·VB/ASP 调用 SQL Server 的存储过程
·?dos下编译.net程序找不到csc.exe文件
·通过Web Services上传和下载文件
·学习笔记(补)《.NET框架程序设计(修订版)》--目录
·VB.NET实现DirectDraw9 (2) 动画
·VB.NET实现DirectDraw9 (1) 托管的DDraw
·建站框架规范书之——文件命名

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
自定义线程池-c#的简单实现

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

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

{

    /// <summary>

    /// 线程管理器,会开启或唤醒一个线程去执行指定的回调方法

    /// </summary>

    public class ThreadManager

    {

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

       

        //不允许创建实例

        private ThreadManager()

        {

        }

 

        /// <summary>

        /// 静态方法,开启或唤醒一个线程去执行指定的回调方法

        /// </summary>

        /// <param name="waitCallback">委托实例</param>

        /// <param name="obj">传递给回调方法的参数</param>

        /// <param name="timeOut">当没有可用的线程时的等待时间,以毫秒为单位</param>

        /// <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

{

    /// <summary>

    /// 封装 .NET 框架提供的 Thread

    /// </summary>

    internal class MyThread

    {

        private Thread t;       //线程

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

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

 

        /// <summary>

        /// 执行回调方法的线程

        /// </summary>

        public Thread T

        {

            get

            {

                return t;

            }

        }

 

        public MyThread()

        {

        }

 

        /// <summary>

        /// 开启新线程或唤醒线程,去执行回调方法

        /// </summary>

        /// <param name="w">用回调方法实例化了的委托实例</param>

        /// <param name="o">传递给回调方法的参数值</param>

        /// <param name="isSuspend">true 表示线程为挂起状态,false 则表示线程还没创建</param>

        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();

            }

        }

 

        /// <summary>

        /// 线程执行的方法

        /// </summary>

        private void ThreadProc()

        {

            //死循环,使线程唤醒后不是退出,而是继续通过委托执行回调方法

            while (true)

            {

                //通过委托执行回调方法

                w(o);

                t.Suspend();

            }

        }

    }

}

 

3.Test.cs

using System;

using System.Threading;

 

namespace CustomThreadPool

{

    /// <summary>

    /// 测试自定义线程池

    /// </summary>

    class Test

    {

        /// <summary>

        /// 应用程序的主入口点。

        /// </summary>

        [STAThread]

        static void Main(string[] args)

        {

            //

            // TODO: 在此处添加代码以启动应用程序

            //

 

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

            {

                Console.WriteLine("Start thread {0}", i.ToString());

                Thread t = new Thread(new ThreadStart(WorkThread));

                t.Start();

            }

 

            Console.ReadLine();

            Thread.CurrentThread.Abort();

        }

 

        public static void WorkThread()

        {

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

            {

                if (i % 2 == 0)

                {

                    if (!ThreadManager.QueueUserWorkItem(new WaitCallback(ThreadProcOne), i, 2000))

                    {

                        Console.WriteLine("Failed" + i.ToString());

                    }

                }

                else

                {

                    if (!ThreadManager.QueueUserWorkItem(new WaitCallback(ThreadProcTwo), i, 2000))

                    {

                        Console.WriteLine("Failed" + i.ToString());

                    }

                }

            }

 

            Thread.CurrentThread.Abort();

        }

 

        public static void ThreadProcOne(Object stateInfo)

        {

            Console.WriteLine("Test custom threadpool:" + ((int)stateInfo).ToString());

        }

 

        public static void ThreadProcTwo(Object stateInfo)

        {

            Console.WriteLine("Change work:" + ((int)stateInfo).ToString());

        }

    }

}

 

 




相关文章

相关软件