C#自定义线程池
自定义线程池-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#自定义线程池的更多相关文章
- Android线程管理之ThreadPoolExecutor自定义线程池
前言: 上篇主要介绍了使用线程池的好处以及ExecutorService接口,然后学习了通过Executors工厂类生成满足不同需求的简单线程池,但是有时候我们需要相对复杂的线程池的时候就需要我们自己 ...
- Android AsyncTask 深度理解、简单封装、任务队列分析、自定义线程池
前言:由于最近在做SDK的功能,需要设计线程池.看了很多资料不知道从何开始着手,突然发现了AsyncTask有对线程池的封装,so,就拿它开刀,本文将从AsyncTask的基本用法,到简单的封装,再到 ...
- Android 自定义线程池的实战
前言:在上一篇文章中我们讲到了AsyncTask的基本使用.AsyncTask的封装.AsyncTask 的串行/并行线程队列.自定义线程池.线程池的快速创建方式. 对线程池不了解的同学可以先看 An ...
- c#网络通信框架networkcomms内核解析之十 支持优先级的自定义线程池
NetworkComms网络通信框架序言 本例基于networkcomms2.3.1开源版本 gplv3协议 如果networkcomms是一顶皇冠,那么CommsThreadPool(自定义线程池 ...
- 介绍开源的.net通信框架NetworkComms框架 源码分析(十五 ) CommsThreadPool自定义线程池
原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架 作者是英国人 以前是收费的 目前作者已经开源 许可是 ...
- 一个自定义线程池的小Demo
在项目中如果是web请求时候,IIS会自动分配一个线程来进行处理,如果很多个应用程序共享公用一个IIS的时候,线程分配可能会出现一个问题(当然也是我的需求造成的) 之前在做项目的时候,有一个需求,就是 ...
- JAVA并发,线程工厂及自定义线程池
package com.xt.thinks21_2; import java.util.concurrent.ExecutorService; import java.util.concurrent. ...
- java多线程(四)-自定义线程池
当我们使用 线程池的时候,可以使用 newCachedThreadPool()或者 newFixedThreadPool(int)等方法,其实我们深入到这些方法里面,就可以看到它们的是实现方式是这样的 ...
- spring boot / cloud (四) 自定义线程池以及异步处理@Async
spring boot / cloud (四) 自定义线程池以及异步处理@Async 前言 什么是线程池? 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务.线 ...
随机推荐
- oracle报错ORA-01507
SHUTDOWN IMMEDIATE; STARTUP NOMOUNT; CONTROL1.CTL文件复制到CONTROL2.CTL; ALTER SYSTEM SET CONTROL_FILES=' ...
- 使用 Puppet 在 Windows Azure 中配备 Linux 和 Windows 环境
发布于 2013-12-11 作者 Ross Gardler 微软开放技术有限公司 (MS Open Tech) 很高兴地宣布发行新的 Windows Azure Puppet 模块.通过这个模 ...
- 用sql语句写排名
使用SQL语句求排名 表jh03有下列数据: name score aa 99 bb 56 cc 56 dd 77 ee 78 ff 76 gg 78 ff 50 1. 名次生成方式1 , Score ...
- win7下安装load generator
win7下只安装loadrunner load generator 1.点击setup.exe 2.选择“loadrunner 完整安装程序” 3.安装完成所需要的插件,然后重启 4.重新打开安装 ...
- linux 命令拾遗
man ascii 这个命令会打印出八进制.十六进制和十进制的ASCII码表. xxd xxd可以生成所给与文件的十六进制拷贝,也可以将编辑好的十六进制拷贝还原成二进制格式.它也可以将十六进制拷贝输出 ...
- 每隔一段时间执行一次函数。window.setTimeout
timer2 = window.setTimeout("showTaxi()", 30000);//30秒从后台获取一次数据,显示在地图上. 原来试过 setInterval . ...
- [ZETCODE]wxWidgets教程一:介紹
本教程原文链接:http://zetcode.com/gui/wxwidgets/introduction/ 翻译:瓶哥 日期:2013年11月26日星期二 邮箱: 414236069@qq.com ...
- Tornado源码探寻(开篇)
一.先从一个简单的socket说起 运行脚本并在浏览器上访问http://127.0.0.1:8080 #!/usr/bin/env python #coding:utf-8 import socke ...
- hdoj 2074 叠筐
叠筐 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...
- UILabel字体加粗等属性和特效
/* Accessing the Text Attributes text property font property textColor property textAlignment pr ...