写点什么

ThreadPool 的线程开启、线程等待、线程池的设置、定时功能

作者:C++后台开发
  • 2022-11-25
    湖南
  • 本文字数:1880 字

    阅读完需:约 6 分钟

ThreadPool的线程开启、线程等待、线程池的设置、定时功能

一. ThreadPool 简介

ThreadPool 简介:ThreadPool 是一个线程池,当你需要开启 n 个线程时候,只需把这个指令抛给线程池,它将自动分配线程进行处理,它诞生于.Net 2.0 时代。


ThreadPool 与 Thread 的区别:


①:Thread 每开启一个异步任务,就需要使用一个 Thread,具有专一性,即使 Thread 已经死掉,仍然需要占用资源。


②:ThreadPool 能实现 n 个线程处理 n+m 个异步任务,且没有死线程,默认都是初始化的。

二. 深究 ThreadPool 类

1:QueueUserWorkItem 方法,将方法排入队列以便开启异步线程,它有两个重载。

a:QueueUserWorkItem(WaitCallback callBack),WaitCallback 是一个有一个 object 类型参数且无返回值的委托


b:QueueUserWorkItem(WaitCallback callBack, object state),WaitCallback 是一个有一个 object 类型参数且无返回值的委托,state 即 WaitCallback 中需要的参数, 不推荐这么使用,存在拆箱装箱的转换问题,影响性能。


使用方式:


a:严格的卡定义的写法,第一个重载和第二个重载均是处理有一个参数的函数,大于一个参数需要封装一个实体类,所需参数在实体类的构造函数中引入,然后调用第一个重载即可.


(不推荐这种写法)


通用写法: (可以处理任何参数个数的方法),这里不使用 n 即可。

ThreadPool.QueueUserWorkItem((n) =>

{

TestThread2(i.ToString(),i.ToString());

});

通用写法的简化版:

ThreadPool.QueueUserWorkItem(n => TestThread2(i.ToString(), i.ToString()));


代码如下:


2:线程等待(有局限性的)

利用 ManualResetEvent 类和 WaitOne 方法,多个线程的话需要写 for 循环。



运行结果:


更多 C++后台开发技术点知识内容包括 C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,流媒体,音视频开发,Linux 内核,TCP/IP,协程,DPDK 多个高级知识点。


C/C++Linux服务器开发高级架构师/C++后台开发架构师免费学习地址


【文章福利】另外还整理一些C++后台开发架构师 相关学习资料,面试题,教学视频,以及学习路线图,免费分享有需要的可以点击领取


3:常用方法

a:设置工作线程和 IO 线程的最大和最小值,SetMaxThreads 和 SetMinThreads。


b:获取工作线程和 IO 线程最大、最小、可用值,GetMaxThreads、GetMinThreads、GetAvailableThreads。



测试结果:



三. 扩展一个定时器功能

1:RegisterWaitForSingleObject 类,但是不常用.(涉及到定时任务,建议使用 Quartz.Net)


2:System.threading 命名空间下的 Thread 类,通过查看源码,构造函数中有四个参数,第一个是 object 参数的委托,第二个是委托需要的值,


第三个是调用 callback 之前延迟的时间量(以毫秒为单位)


第四个是 调用 callback 的时间间隔(以毫秒为单位)


 1   private void button12_Click(object sender, EventArgs e) 2         { 3             Stopwatch watch = new Stopwatch(); 4             watch.Start(); 5             Console.WriteLine("----------------- button_Click 开始 主线程id为:{0}  --------------------------", Thread.CurrentThread.ManagedThreadId); 6  7             #region 01-RegisterWaitForSingleObject 8             //{ 9             //    //每隔3s开启一个线程执行业务逻辑10             //    ThreadPool.RegisterWaitForSingleObject(new AutoResetEvent(true), new WaitOrTimerCallback((obj, b) =>11             //    {12             //        //做逻辑判断,编写业务逻辑13             //        Console.WriteLine("obj={0},tid={1}, datetime={2}", obj, Thread.CurrentThread.ManagedThreadId, DateTime.Now);14 15             //    }), "hello world", 3000, false); 16             //}      17             #endregion18 19             #region 02-Timer类20             {21                 //2秒后开启该线程,然后每隔4s调用一次22                 System.Threading.Timer timer = new System.Threading.Timer((n) =>23                 {24                     //书写业务逻辑25                     Console.WriteLine("我是子线程中的业务逻辑哦");26                 }, "1", 2000, 4000);27             }28             #endregion29 30 31             watch.Stop();32             Console.WriteLine("----------------- button_Click 结束 主线程id为:{0}  总耗时:{1}--------------------------", Thread.CurrentThread.ManagedThreadId, watch.ElapsedMilliseconds);33 34         }
复制代码


原文链接:第三节:ThreadPool 的线程开启、线程等待、线程池的设置、定时功能 - Yaopengfei - 博客园

用户头像

C/C++后台开发技术交流qun:720209036 2022-05-06 加入

还未添加个人简介

评论

发布
暂无评论
ThreadPool的线程开启、线程等待、线程池的设置、定时功能_线程_C++后台开发_InfoQ写作社区