自定义threadpool

 
由二部分组成,一个线程管理类 ThreadManager ,一个线程类 MyThread
Test
类是用来测试的
下面是代码,希望大家提出更好的建议:

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());
                   }
         }
}
 
 
在Spring Boot中整合自定义线程池需要以下步骤: 1. 创建自定义线程池的类,继承ThreadPoolExecutor类,并实现构造方法和其它必要的方法。 ```java public class CustomThreadPool extends ThreadPoolExecutor { public CustomThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); } @Override protected void beforeExecute(Thread t, Runnable r) { super.beforeExecute(t, r); } @Override protected void afterExecute(Runnable r, Throwable t) { super.afterExecute(r, t); } @Override protected void terminated() { super.terminated(); } } ``` 2. 在Spring Boot的配置文件application.properties中定义线程池的属性。 ```properties threadPool.corePoolSize=5 threadPool.maximumPoolSize=10 threadPool.keepAliveTime=60 threadPool.queueCapacity=100 ``` 3. 创建线程池的Bean,使用@Value注解获取配置文件中定义的属性,初始化自定义线程池并返回。 ```java @Configuration public class ThreadPoolConfig { @Value("${threadPool.corePoolSize}") private int corePoolSize; @Value("${threadPool.maximumPoolSize}") private int maximumPoolSize; @Value("${threadPool.keepAliveTime}") private long keepAliveTime; @Value("${threadPool.queueCapacity}") private int queueCapacity; @Bean public ExecutorService threadPoolTaskExecutor() { CustomThreadPool threadPool = new CustomThreadPool(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, new LinkedBlockingQueue<>(queueCapacity)); return threadPool; } } ``` 4. 在需要使用线程池的地方注入该Bean,即可使用自定义线程池。 ```java @Service public class MyService { @Autowired private ExecutorService threadPool; public void doTask() { threadPool.execute(() -> { // 执行任务 }); } } ``` 这样,我们就可以在Spring Boot中成功整合自定义线程池了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值