自定义线程池ThreadPool

2024-04-24 21:38
文章标签 线程 自定义 threadpool

本文主要是介绍自定义线程池ThreadPool,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

这篇关于自定义线程池ThreadPool的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/932916

相关文章

聊聊springboot中如何自定义消息转换器

《聊聊springboot中如何自定义消息转换器》SpringBoot通过HttpMessageConverter处理HTTP数据转换,支持多种媒体类型,接下来通过本文给大家介绍springboot中... 目录核心接口springboot默认提供的转换器如何自定义消息转换器Spring Boot 中的消息

Python自定义异常的全面指南(入门到实践)

《Python自定义异常的全面指南(入门到实践)》想象你正在开发一个银行系统,用户转账时余额不足,如果直接抛出ValueError,调用方很难区分是金额格式错误还是余额不足,这正是Python自定义异... 目录引言:为什么需要自定义异常一、异常基础:先搞懂python的异常体系1.1 异常是什么?1.2

Linux中的自定义协议+序列反序列化用法

《Linux中的自定义协议+序列反序列化用法》文章探讨网络程序在应用层的实现,涉及TCP协议的数据传输机制、结构化数据的序列化与反序列化方法,以及通过JSON和自定义协议构建网络计算器的思路,强调分层... 目录一,再次理解协议二,序列化和反序列化三,实现网络计算器3.1 日志文件3.2Socket.hpp

SpringBoot实现虚拟线程的方案

《SpringBoot实现虚拟线程的方案》Java19引入虚拟线程,本文就来介绍一下SpringBoot实现虚拟线程的方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录什么是虚拟线程虚拟线程和普通线程的区别SpringBoot使用虚拟线程配置@Async性能对比H

C语言自定义类型之联合和枚举解读

《C语言自定义类型之联合和枚举解读》联合体共享内存,大小由最大成员决定,遵循对齐规则;枚举类型列举可能值,提升可读性和类型安全性,两者在C语言中用于优化内存和程序效率... 目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.2.1 特点11.2.2 特点21.2.3 特点31.3 联合体的大小1

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

Java中的xxl-job调度器线程池工作机制

《Java中的xxl-job调度器线程池工作机制》xxl-job通过快慢线程池分离短时与长时任务,动态降级超时任务至慢池,结合异步触发和资源隔离机制,提升高频调度的性能与稳定性,支撑高并发场景下的可靠... 目录⚙️ 一、调度器线程池的核心设计 二、线程池的工作流程 三、线程池配置参数与优化 四、总结:线程