自定义线程池-c#的简单实现
1.ThreadManager.cs
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.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.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());
}
}
}
转载于:https://www.cnblogs.com/tallman/archive/2007/05/10/741639.html
自定义线程池-c#的简单实现相关推荐
- Android AsyncTask 深度理解、简单封装、任务队列分析、自定义线程池
前言:由于最近在做SDK的功能,需要设计线程池.看了很多资料不知道从何开始着手,突然发现了AsyncTask有对线程池的封装,so,就拿它开刀,本文将从AsyncTask的基本用法,到简单的封装,再到 ...
- android自定义线程池工具类,妈妈再也不用担心你不会使用线程池了(ThreadUtils)...
为什么要用线程池 使用线程池管理线程有如下优点:降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行. 提高线程的可 ...
- Spring Boot使用@Async实现异步调用:自定义线程池
在之前的Spring Boot基础教程系列中,已经通过<Spring Boot中使用@Async实现异步调用>一文介绍过如何使用 @Async注解来实现异步调用了.但是,对于这些异步执行的 ...
- 【Android 异步操作】线程池 ( 线程池使用示例 | 自定义线程池使用流程 | 自定义任务拒绝处理策略 | 完整代码示例 )
文章目录 一.自定义线程池使用流程 二.自定义任务拒绝处理策略 三.完整代码示例 在博客 [Android 异步操作]线程池 ( 线程池简介 | 线程池初始化方法 | 线程池种类 | AsyncTas ...
- 自定义线程池内置线程池的使用 ThreadPoolExecutor和Executorservice 示例与注意事项
文章目录 线程池介绍 自己设计一个线程池 1.设计ThreadPool类: 2.设计工作队列 3.实现自己设计的线程池 用java的ThreadPoolExecutor自定义线程池 自定义线程池-参数 ...
- Android 自定义线程池的实战
前言:在上一篇文章中我们讲到了AsyncTask的基本使用.AsyncTask的封装.AsyncTask 的串行/并行线程队列.自定义线程池.线程池的快速创建方式. 对线程池不了解的同学可以先看 An ...
- 自定义线程池-java内置线程池构造方法介绍
Java内置线程池原理剖析 我们要想自定义线程池,必须先了解线程池的工作原理,才能自己定义线程池:这里我们通过观察java中ThreadPoolExecutor的源码来学习线程池的原理; Thread ...
- 自定义java线程池_我的Java自定义线程池执行器
自定义java线程池 ThreadPoolExecutor是Java并发api添加的一项功能,可以有效地维护和重用线程,因此我们的程序不必担心创建和销毁线程,也不必关注核心功能. 我创建了一个自定义线 ...
- 我的Java自定义线程池执行器
ThreadPoolExecutor是Java并发api添加的一项功能,可以有效地维护和重用线程,因此我们的程序不必担心创建和销毁线程,而将精力放在核心功能上. 我创建了一个自定义线程池执行程序,以更 ...
- java自定义线程_Java自定义线程池详解
自定义线程池的核心:ThreadPoolExecutor 为了更好的控制多线程,JDK提供了一套线程框架Executor,帮助开发人员有效的进行线程控制,其中在java.util.concurrent ...
最新文章
- 无人驾驶 | 为什么双目自动驾驶系统难以普及?
- Sql Server系列:Transact-SQL概述
- 退休是不可能的,90岁还要继续干!
- C语言位操作符的使用
- [C++对象模型][9]虚继承与虚函数表
- Python Django 事务管理
- 一、【Collection、泛型】
- ifix虚拟服务器,ifix的客户端和服务器
- Python 面向对象(二)
- ASP.NET 安全性
- 和当前时间比较_货币的时间价值
- MYSQL的安装基础语法笔记
- unity3d进行脚本资源打包加载
- 传输层 可靠传输 连续ARQ协议和滑动窗口协议
- 雷电4.0 Fiddler https抓包详解(绝对可行)
- gerrit 用法 topic
- CDH和Hadoop的区别
- 初学编程,学哪种语言比较好?
- Python jieba分词如何添加自定义词和去除不需要长尾词
- oracle如何格式化日期,Oracle 日期格式化处理汇总
热门文章
- C语言删除字符数组中指定的字符(C笔记)
- 处理数字音乐文件用计算机软件,工具软件商标注册属于第几类?
- controlleradvice 参数_Spring mvc中@ModelAttribute和@ControllerAdvice使用
- mmlspark-101: TrainClassifier
- 算法:分离链表为两部分,小于某个值都在左边,大于等于某个值在右边 Partition List
- linux安装unity桌面环境,Ubuntu 14.04 server安装桌面环境
- Transformer-XL、Vanilla Transformer
- 203.移除链表元素
- python join函数的作用_Python join()函数原理及使用方法
- r5处理器_买完笔记本特别的卡?那是因为你买笔记本之前,处理器没选对