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

相关文章

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

一文详解Java Stream的sorted自定义排序

《一文详解JavaStream的sorted自定义排序》Javastream中的sorted方法是用于对流中的元素进行排序的方法,它可以接受一个comparator参数,用于指定排序规则,sorte... 目录一、sorted 操作的基础原理二、自定义排序的实现方式1. Comparator 接口的 Lam

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

如何自定义一个log适配器starter

《如何自定义一个log适配器starter》:本文主要介绍如何自定义一个log适配器starter的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求Starter 项目目录结构pom.XML 配置LogInitializer实现MDCInterceptor

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流

Java中常见队列举例详解(非线程安全)

《Java中常见队列举例详解(非线程安全)》队列用于模拟队列这种数据结构,队列通常是指先进先出的容器,:本文主要介绍Java中常见队列(非线程安全)的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一.队列定义 二.常见接口 三.常见实现类3.1 ArrayDeque3.1.1 实现原理3.1.2

SpringBoot3中使用虚拟线程的完整步骤

《SpringBoot3中使用虚拟线程的完整步骤》在SpringBoot3中使用Java21+的虚拟线程(VirtualThreads)可以显著提升I/O密集型应用的并发能力,这篇文章为大家介绍了详细... 目录1. 环境准备2. 配置虚拟线程方式一:全局启用虚拟线程(Tomcat/Jetty)方式二:异步

如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socket read timed out的问题

《如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socketreadtimedout的问题》:本文主要介绍解决Druid线程... 目录异常信息触发场景找到版本发布更新的说明从版本更新信息可以看到该默认逻辑已经去除总结异常信息触发场景复

Druid连接池实现自定义数据库密码加解密功能

《Druid连接池实现自定义数据库密码加解密功能》在现代应用开发中,数据安全是至关重要的,本文将介绍如何在​​Druid​​连接池中实现自定义的数据库密码加解密功能,有需要的小伙伴可以参考一下... 目录1. 环境准备2. 密码加密算法的选择3. 自定义 ​​DruidDataSource​​ 的密码解密3