• 网络学院
  • 新手学堂
  • 操作系统
  • 网络技术
  • 软件应用
  • 办公软件
  • 编程技术
  • 网站架设
  • 数据库类
  • 平面设计
  • 多媒体类
  • 游戏资讯
  • 教学论文
  • 认证考试
自定义线程池-c#的简单实现
广告位
  站点:
  • 首 页
  • 最新软件
  • 最新文章
  • 国内软件
  • 国外软件
  • 汉化软件
  • 源码下载
  • 字体下载
自定义线程池-c#的简单实现
软件发布 自定义线程池-c#的简单实现
网络软件 系统工具 应用软件 联络聊天 图形图像 多媒体类 行业软件 游戏娱乐 编程开发 安全相关 教育教学 数码软件
热门软件: QQ 瑞星 pplive e话通 木马克星 千千静听 office2000 五笔字根 Photoshop 视频分割
返回首页 | 文章首页 | 编程技术 | C#教程 | 自定义线程池-c#的简单实现

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

 

添加时间: 2007-7-15 3:26:47  作者: c#教程  阅读次数:91   来源: http://www.d9soft.com

 

 

       

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


}


}


}

 

 

 

上下文章:

 

上一篇文章: C#中调用Windows API的要点 下一篇文章: C#2.0 新特性探究之委托与匿名委托

相关文章:

  • Photoshop简单的艺术化效果
  • 在ORACLE的存储过程中如何做简单的动态查询
  • servlet实现oracle中读出文件并显示
  • 在Oracle中实现数据库的复制
  • 在T-SQL中实现Oracle的MINUS集合运算符

相关软件:

  • TTVNC 最简单的远程协助软件 V2.1
  • 自定义系统设置 V1.0
  • 简单五笔 V1.7
  • 简单游绿色梦幻游戏工具平台 V3.70.2181
  • 简单进销存管理软件 V2.30
  • 简单影音 V2008 01.25

 

 

快速导航

  • 网络学院
  • 精品汇聚
  • 字体下载
  • 教程下载
  • ASP源码
  • PHP源码
  • Net源码
  • JSP 源码

编程技术分类导航

  • ASP & ASP.NET教程
  • PHP教程
  • JSP教程
  • C/C++教程
  • VB & VB.NET教程
  • VC教程
  • Delphi教程
  • BCB教程
  • VFP教程
  • PB教程
  • JAVA教程
  • XML教程
  • C#教程
  • CGI教程

本类经典文章推荐

  • ADO.NET的开发场景及传统ADO的处理
  • 利用Visual C#实现Window管道技术
  • C#取得汉字的拼音的首字母
  • 使用C#编写DES加密程序的framework
  • Visual C#编写3D游戏框架示例
  • 用C#和本地Windows API操纵系统菜...
  • 在C#程序设计中使用Win32类库
  • Visual C#中调用Windows服务初探
  • 如何在C#的WinForm中制作饼状图和...
  • C#中实现DataGrid双向排序

C#教程阅读排行

  • 如何在C#的WinForm中制作饼状图和...
  • 浅析C#中图形编程
  • 用C#和本地Windows API操纵系统菜...
  • 彻底剖析C# 2.0泛型类的创建和使用
  • Visual C#编写3D游戏框架示例
  • 使用C#编写DES加密程序的framework
  • Visual C# 2005实现控件中捕获按键
  • Visual C#中调用Windows服务初探
  • C#如何在Form中嵌入并且操作Excel...
  • C#中利用mediaplayer打造mp3播放器

编程技术阅读总排行

  • VB入门教程之一
  • 第二章 PowerBuilder 入门之创建新...
  • Java连接数据库实例
  • 第一章 什么是PowerBuilder
  • VC++之List Box/Check List Box控...
  • VC++ List Ctrl控件
  • VC++ Combo Box/Combo Box Ex控件
  • 学C++不得不看的一篇文章
  • VB入门教程之二
  • VC++之Button控件

广告位置

字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 回到顶部

关于我们 | 版权声明 | 免责条款 | 广告联系 | 软件发布 | 下载帮助 | 下载排行 | 网站地图 | 特别鸣谢 | 友情连接

copyright; 2005-2008 D9soft.com 第九软件网 版权所有