自定义线程池-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;       //线程

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

        }

    }

}

转载于:https://www.cnblogs.com/tallman/archive/2007/05/10/741639.html

自定义线程池-c#的简单实现相关推荐

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

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

  2. android自定义线程池工具类,妈妈再也不用担心你不会使用线程池了(ThreadUtils)...

    为什么要用线程池 使用线程池管理线程有如下优点:降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行. 提高线程的可 ...

  3. Spring Boot使用@Async实现异步调用:自定义线程池

    在之前的Spring Boot基础教程系列中,已经通过<Spring Boot中使用@Async实现异步调用>一文介绍过如何使用 @Async注解来实现异步调用了.但是,对于这些异步执行的 ...

  4. 【Android 异步操作】线程池 ( 线程池使用示例 | 自定义线程池使用流程 | 自定义任务拒绝处理策略 | 完整代码示例 )

    文章目录 一.自定义线程池使用流程 二.自定义任务拒绝处理策略 三.完整代码示例 在博客 [Android 异步操作]线程池 ( 线程池简介 | 线程池初始化方法 | 线程池种类 | AsyncTas ...

  5. 自定义线程池内置线程池的使用 ThreadPoolExecutor和Executorservice 示例与注意事项

    文章目录 线程池介绍 自己设计一个线程池 1.设计ThreadPool类: 2.设计工作队列 3.实现自己设计的线程池 用java的ThreadPoolExecutor自定义线程池 自定义线程池-参数 ...

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

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

  7. 自定义线程池-java内置线程池构造方法介绍

    Java内置线程池原理剖析 我们要想自定义线程池,必须先了解线程池的工作原理,才能自己定义线程池:这里我们通过观察java中ThreadPoolExecutor的源码来学习线程池的原理; Thread ...

  8. 自定义java线程池_我的Java自定义线程池执行器

    自定义java线程池 ThreadPoolExecutor是Java并发api添加的一项功能,可以有效地维护和重用线程,因此我们的程序不必担心创建和销毁线程,也不必关注核心功能. 我创建了一个自定义线 ...

  9. 我的Java自定义线程池执行器

    ThreadPoolExecutor是Java并发api添加的一项功能,可以有效地维护和重用线程,因此我们的程序不必担心创建和销毁线程,而将精力放在核心功能上. 我创建了一个自定义线程池执行程序,以更 ...

  10. java自定义线程_Java自定义线程池详解

    自定义线程池的核心:ThreadPoolExecutor 为了更好的控制多线程,JDK提供了一套线程框架Executor,帮助开发人员有效的进行线程控制,其中在java.util.concurrent ...

最新文章

  1. 无人驾驶 | 为什么双目自动驾驶系统难以普及?
  2. Sql Server系列:Transact-SQL概述
  3. 退休是不可能的,90岁还要继续干!
  4. C语言位操作符的使用
  5. [C++对象模型][9]虚继承与虚函数表
  6. Python Django 事务管理
  7. 一、【Collection、泛型】
  8. ifix虚拟服务器,ifix的客户端和服务器
  9. Python 面向对象(二)
  10. ASP.NET 安全性
  11. 和当前时间比较_货币的时间价值
  12. MYSQL的安装基础语法笔记
  13. unity3d进行脚本资源打包加载
  14. 传输层 可靠传输 连续ARQ协议和滑动窗口协议
  15. 雷电4.0 Fiddler https抓包详解(绝对可行)
  16. gerrit 用法 topic
  17. CDH和Hadoop的区别
  18. 初学编程,学哪种语言比较好?
  19. Python jieba分词如何添加自定义词和去除不需要长尾词
  20. oracle如何格式化日期,Oracle 日期格式化处理汇总

热门文章

  1. C语言删除字符数组中指定的字符(C笔记)
  2. 处理数字音乐文件用计算机软件,工具软件商标注册属于第几类?
  3. controlleradvice 参数_Spring mvc中@ModelAttribute和@ControllerAdvice使用
  4. mmlspark-101: TrainClassifier
  5. 算法:分离链表为两部分,小于某个值都在左边,大于等于某个值在右边 Partition List
  6. linux安装unity桌面环境,Ubuntu 14.04 server安装桌面环境
  7. Transformer-XL、Vanilla Transformer
  8. 203.移除链表元素
  9. python join函数的作用_Python join()函数原理及使用方法
  10. r5处理器_买完笔记本特别的卡?那是因为你买笔记本之前,处理器没选对