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

相关文章

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Spring Boot3虚拟线程的使用步骤详解

《SpringBoot3虚拟线程的使用步骤详解》虚拟线程是Java19中引入的一个新特性,旨在通过简化线程管理来提升应用程序的并发性能,:本文主要介绍SpringBoot3虚拟线程的使用步骤,... 目录问题根源分析解决方案验证验证实验实验1:未启用keep-alive实验2:启用keep-alive扩展建

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

Java终止正在运行的线程的三种方法

《Java终止正在运行的线程的三种方法》停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作,停止一个线程可以用Thread.stop()方法,但最好不要用它,本文给大家介绍了... 目录前言1. 停止不了的线程2. 判断线程是否停止状态3. 能停止的线程–异常法4. 在沉睡中停止5

基于Spring实现自定义错误信息返回详解

《基于Spring实现自定义错误信息返回详解》这篇文章主要为大家详细介绍了如何基于Spring实现自定义错误信息返回效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录背景目标实现产出背景Spring 提供了 @RestConChina编程trollerAdvice 用来实现 HTT

SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

《SpringSecurity认证、注销、权限控制功能(注销、记住密码、自定义登入页)》SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案... 目录简介认识Spring Security“认证”(Authentication)“授权” (Auth

Java捕获ThreadPoolExecutor内部线程异常的四种方法

《Java捕获ThreadPoolExecutor内部线程异常的四种方法》这篇文章主要为大家详细介绍了Java捕获ThreadPoolExecutor内部线程异常的四种方法,文中的示例代码讲解详细,感... 目录方案 1方案 2方案 3方案 4结论方案 1使用 execute + try-catch 记录

SpringBoot自定义注解如何解决公共字段填充问题

《SpringBoot自定义注解如何解决公共字段填充问题》本文介绍了在系统开发中,如何使用AOP切面编程实现公共字段自动填充的功能,从而简化代码,通过自定义注解和切面类,可以统一处理创建时间和修改时间... 目录1.1 问题分析1.2 实现思路1.3 代码开发1.3.1 步骤一1.3.2 步骤二1.3.3

dubbo3 filter(过滤器)如何自定义过滤器

《dubbo3filter(过滤器)如何自定义过滤器》dubbo3filter(过滤器)类似于javaweb中的filter和springmvc中的intercaptor,用于在请求发送前或到达前进... 目录dubbo3 filter(过滤器)简介dubbo 过滤器运行时机自定义 filter第一种 @A