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

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

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;

//委托,这里直接用 .NET 框架自带的,

//也可以根据需要自己定义一个

private WaitCallback w;

//传递给符合委托的回调方法的参数值,

//根据委托的定义而定

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#自定义线程池的更多相关文章

  1. Android线程管理之ThreadPoolExecutor自定义线程池

    前言: 上篇主要介绍了使用线程池的好处以及ExecutorService接口,然后学习了通过Executors工厂类生成满足不同需求的简单线程池,但是有时候我们需要相对复杂的线程池的时候就需要我们自己 ...

  2. Android AsyncTask 深度理解、简单封装、任务队列分析、自定义线程池

    前言:由于最近在做SDK的功能,需要设计线程池.看了很多资料不知道从何开始着手,突然发现了AsyncTask有对线程池的封装,so,就拿它开刀,本文将从AsyncTask的基本用法,到简单的封装,再到 ...

  3. Android 自定义线程池的实战

    前言:在上一篇文章中我们讲到了AsyncTask的基本使用.AsyncTask的封装.AsyncTask 的串行/并行线程队列.自定义线程池.线程池的快速创建方式. 对线程池不了解的同学可以先看 An ...

  4. c#网络通信框架networkcomms内核解析之十 支持优先级的自定义线程池

    NetworkComms网络通信框架序言 本例基于networkcomms2.3.1开源版本  gplv3协议 如果networkcomms是一顶皇冠,那么CommsThreadPool(自定义线程池 ...

  5. 介绍开源的.net通信框架NetworkComms框架 源码分析(十五 ) CommsThreadPool自定义线程池

    原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架  作者是英国人  以前是收费的 目前作者已经开源  许可是 ...

  6. 一个自定义线程池的小Demo

    在项目中如果是web请求时候,IIS会自动分配一个线程来进行处理,如果很多个应用程序共享公用一个IIS的时候,线程分配可能会出现一个问题(当然也是我的需求造成的) 之前在做项目的时候,有一个需求,就是 ...

  7. JAVA并发,线程工厂及自定义线程池

    package com.xt.thinks21_2; import java.util.concurrent.ExecutorService; import java.util.concurrent. ...

  8. java多线程(四)-自定义线程池

    当我们使用 线程池的时候,可以使用 newCachedThreadPool()或者 newFixedThreadPool(int)等方法,其实我们深入到这些方法里面,就可以看到它们的是实现方式是这样的 ...

  9. spring boot / cloud (四) 自定义线程池以及异步处理@Async

    spring boot / cloud (四) 自定义线程池以及异步处理@Async 前言 什么是线程池? 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务.线 ...

随机推荐

  1. Unity3D-基本导航(NavMesh)功能实现

    1: 打开场景 2:打开Navgation窗口 菜单中: Window --> Navgation, 在Inspector旁边会出现导航界面 这个Objcet的面板是对应当前选择的物体的,旁边的 ...

  2. asp.net Post Get提交数据转Model实例

    转自:http://blog.csdn.net/daodaowolf/article/details/8990694 此功能是将客户端HTTP协议POST GET方式提交的数据转换为某个Model实例 ...

  3. [资源共享]C#+AE构建GIS桌面端应用系统框架-全代码

    转自:http://www.cnblogs.com/gispeng/archive/2008/10/06/1304534.html    [资源共享]C#+AE构建GIS桌面端应用系统框架-全代码 ( ...

  4. Suse系统用户不能登录报错

    Linux系统用户创建了user用户,使用putty登陆系统,用户为user,系统登陆报 错: Could not chdir to home directory /home/user: Permis ...

  5. ARM学习笔记6——程序状态寄存器访问指令

    这两条指令结合,可用于对CPSR或SPSR进行读/写操作. 当需要保存或修改当前模式下CPSR或SPSR的内容时,首先必须将这些内容传递到通用寄存器中 1.MRS指令(Move to Register ...

  6. 关于 Unity UGUI 中修改 Mask 组件下 Image 等子节点组件的材质无效的问题

    前几天同事做了一个效果,希望在原本使用了遮罩组件 Mask 的技能图标(让技能图标变成圆形)上在添加一个置灰的功能,但问题来了:因为是动态根据游戏中玩家的条件才动态置灰,以修改 Mask 下子节点 I ...

  7. 关于理解《C++ 对象模型》中:把单一元素的数组放在末尾,struct可以拥有可变大小的数组

    这一章在第19页,写的好深奥,我竟然没看明白在说什么--之后再看了几遍,终于明白了. 原文: C程序员的巧计有时候却成为c++程序员的陷阱.例如把单一元素的数组放在一个struct的末尾,于是每个st ...

  8. bzoj 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居(set+并查集)

    Description 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发现她们已经结成了几个“群”.每只奶牛在吃草的 时候有一个独一无二的位置坐标Xi,Yi( ...

  9. cuda(1) 最大并发量

    Created on 2013-8-5URL : http://blog.sina.com.cn/s/blog_a502f1a30101mi6t.html@author: zhxfl转载请说明出处 c ...

  10. poj 2406 Power Strings【最小循环节】

    Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 36926   Accepted: 15254 D ...