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

相关文章

Spring Boot 中正确地在异步线程中使用 HttpServletRequest的方法

《SpringBoot中正确地在异步线程中使用HttpServletRequest的方法》文章讨论了在SpringBoot中如何在异步线程中正确使用HttpServletRequest的问题,... 目录前言一、问题的来源:为什么异步线程中无法访问 HttpServletRequest?1. 请求上下文与线

在 Spring Boot 中使用异步线程时的 HttpServletRequest 复用问题记录

《在SpringBoot中使用异步线程时的HttpServletRequest复用问题记录》文章讨论了在SpringBoot中使用异步线程时,由于HttpServletRequest复用导致... 目录一、问题描述:异步线程操作导致请求复用时 Cookie 解析失败1. 场景背景2. 问题根源二、问题详细分

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

java父子线程之间实现共享传递数据

《java父子线程之间实现共享传递数据》本文介绍了Java中父子线程间共享传递数据的几种方法,包括ThreadLocal变量、并发集合和内存队列或消息队列,并提醒注意并发安全问题... 目录通过 ThreadLocal 变量共享数据通过并发集合共享数据通过内存队列或消息队列共享数据注意并发安全问题总结在 J

CSS自定义浏览器滚动条样式完整代码

《CSS自定义浏览器滚动条样式完整代码》:本文主要介绍了如何使用CSS自定义浏览器滚动条的样式,包括隐藏滚动条的角落、设置滚动条的基本样式、轨道样式和滑块样式,并提供了完整的CSS代码示例,通过这些技巧,你可以为你的网站添加个性化的滚动条样式,从而提升用户体验,详细内容请阅读本文,希望能对你有所帮助...

异步线程traceId如何实现传递

《异步线程traceId如何实现传递》文章介绍了如何在异步请求中传递traceId,通过重写ThreadPoolTaskExecutor的方法和实现TaskDecorator接口来增强线程池,确保异步... 目录前言重写ThreadPoolTaskExecutor中方法线程池增强总结前言在日常问题排查中,

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

C语言线程池的常见实现方式详解

《C语言线程池的常见实现方式详解》本文介绍了如何使用C语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧... 目录1. 线程池的基本结构2. 线程池的实现步骤3. 线程池的核心数据结构4. 线程池的详细实现4.1 初

SpringBoot 自定义消息转换器使用详解

《SpringBoot自定义消息转换器使用详解》本文详细介绍了SpringBoot消息转换器的知识,并通过案例操作演示了如何进行自定义消息转换器的定制开发和使用,感兴趣的朋友一起看看吧... 目录一、前言二、SpringBoot 内容协商介绍2.1 什么是内容协商2.2 内容协商机制深入理解2.2.1 内容

Java子线程无法获取Attributes的解决方法(最新推荐)

《Java子线程无法获取Attributes的解决方法(最新推荐)》在Java多线程编程中,子线程无法直接获取主线程设置的Attributes是一个常见问题,本文探讨了这一问题的原因,并提供了两种解决... 目录一、问题原因二、解决方案1. 直接传递数据2. 使用ThreadLocal(适用于线程独立数据)