第三节: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循环。
运行结果:
3:常用方法
a:设置工作线程和IO线程的最大和最小值,SetMaxThreads和SetMinThreads。
b:获取工作线程和IO线程最大、最小、可用值,GetMaxThreads、GetMinThreads、GetAvailableThreads。
测试结果:
三. 扩展一个定时器功能
1:RegisterWaitForSingleObject类,但是不常用.(涉及到定时任务,建议使用Quartz.Net)
2:System.threading命名空间下的Thread类,通过查看源码,构造函数中有四个参数,第一个是object参数的委托,第二个是委托需要的值,
第三个是调用 callback 之前延迟的时间量(以毫秒为单位)
第四个是 调用 callback 的时间间隔(以毫秒为单位)
private void button12_Click(object sender, EventArgs e)
{
Stopwatch watch = new Stopwatch();
watch.Start();
Console.WriteLine("----------------- button_Click 开始 主线程id为:{0} --------------------------", Thread.CurrentThread.ManagedThreadId); #region 01-RegisterWaitForSingleObject
//{
// //每隔3s开启一个线程执行业务逻辑
// ThreadPool.RegisterWaitForSingleObject(new AutoResetEvent(true), new WaitOrTimerCallback((obj, b) =>
// {
// //做逻辑判断,编写业务逻辑
// Console.WriteLine("obj={0},tid={1}, datetime={2}", obj, Thread.CurrentThread.ManagedThreadId, DateTime.Now); // }), "hello world", 3000, false);
//}
#endregion #region 02-Timer类
{
//2秒后开启该线程,然后每隔4s调用一次
System.Threading.Timer timer = new System.Threading.Timer((n) =>
{
//书写业务逻辑
Console.WriteLine("我是子线程中的业务逻辑哦");
}, "", , );
}
#endregion watch.Stop();
Console.WriteLine("----------------- button_Click 结束 主线程id为:{0} 总耗时:{1}--------------------------", Thread.CurrentThread.ManagedThreadId, watch.ElapsedMilliseconds); }
第三节:ThreadPool的线程开启、线程等待、线程池的设置、定时功能的更多相关文章
- 并发编程---线程---开启方式---进程线程的区别----Thread的其他属性
线程 进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合)而线程才是cpu上的执行单位 1.同一个进程内的多个线程共享该进程内的地址资源 2.创建线程的开销远小于创建进程的开销(创建一 ...
- Java并发——线程间的等待与通知
前言: 前面讲完了一些并发编程的原理,现在我们要来学习的是线程之间的协作.通俗来说就是,当前线程在某个条件下需要等待,不需要使用太多系统资源.在某个条件下我们需要去唤醒它,分配给它一定的系统资源,让它 ...
- [深入学习C#]C#实现多线程的方法:线程(Thread类)和线程池(ThreadPool)
简介 使用线程的主要原因:应用程序中一些操作需要消耗一定的时间,比如对文件.数据库.网络的访问等等,而我们不希望用户一直等待到操作结束,而是在此同时可以进行一些其他的操作. 这就可以使用线程来实现. ...
- C#实现多线程的方法:线程(Thread类)和线程池(ThreadPool)
简介 使用线程的主要原因:应用程序中一些操作需要消耗一定的时间,比如对文件.数据库.网络的访问等等,而我们不希望用户一直等待到操作结束,而是在此同时可以进行一些其他的操作. 这就可以使用线程来实现. ...
- Java多线程02(线程安全、线程同步、等待唤醒机制)
Java多线程2(线程安全.线程同步.等待唤醒机制.单例设计模式) 1.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ...
- python_线程的开启、守护线程、锁、死锁、事件、定时器、条件、队列、池
0.承上 什么是线程? CPU调度的最小单位. 线程是进程的必要组成单位. 主线程: 程序开始运行的时候,就产生了一个主线进程来运行这个程序. 子线程: 是由主线程开启的其他线程. · 各线程之间的工 ...
- CyclicBarrier开启多个线程进行计算,最后统计计算结果
有一个大小为50000的数组,要求开启5个线程分别计算10000个元素的和,然后累加得到总和 /** * 开启5个线程进行计算,最后所有的线程都计算完了再统计计算结果 */ public class ...
- Java 之 线程 —线程通信( 等待唤醒机制)
一.线程间通信 概念:多个线程在处理同一资源,但是处理的动作(线程的任务)却不相同. 例如: 线程 A 用来生成包子的,线程 B 用来吃包子的,包子可以理解为同一资源,线程 A 与线程 B 处理的动作 ...
- Python进阶----线程基础,开启线程的方式(类和函数),线程VS进程,线程的方法,守护线程,详解互斥锁,递归锁,信号量
Python进阶----线程基础,开启线程的方式(类和函数),线程VS进程,线程的方法,守护线程,详解互斥锁,递归锁,信号量 一丶线程的理论知识 什么是线程: 1.线程是一堆指令,是操作系统调度 ...
随机推荐
- git如何设置ssh密钥
git设置ssh密钥 目前git支持https和git两种传输协议,github分享链接时会有两种协议可选: 1.Clone with SSH 2.Clone with HTTPS git在使用htt ...
- 英语进阶系列-A04-英语升级练习二
古诗背诵 要求:背诵和朗读,然后翻译成现代文,并绘制图像描述图中的内容,同时看看某些内容可以用什么单词替换,时间限制到15 minutes. 速记词汇系列 要求:将词汇快速朗读并记忆,时间为8 min ...
- python import详解
1.import作用 引入模块 2.import的特点 一个程序中,import的模块不会重复被引用,如: # test1.py import test2 print test2.attr # tes ...
- .NET ORM框架之NHibernate
这段时间一直使用NHibernate,今天抽空总结一下. 1.什么是NHibernate? NHibernate是一个面向.NET环境的对象/关系数据库映射工具.对象/关系数据库映射(object/r ...
- github使用个人总结
1.获取github上面的源码时候,不能获取最新的,因为你的开发工作不一定是最新的要下载历史版本. 2.要使用里面的文件的时候,可以在目录后面url后面添加downloads 这样可以找到封装好的版本 ...
- echarts堆叠图添加总量
echarts在使用中往往会遇到需要展示总量信息的情况,比较典型的就是3维统计的堆叠柱状图 堆叠是在柱状图的基础上,给几项设置同一stack来实现的.不考虑在tips中实现总和,有两种方式可以实现总和 ...
- 采用synchronized关键字写一个显示锁
采用synchronized写一个显示锁 public interface MyLock { void lock () throws InterruptedException; void lock(l ...
- KindEditor富文本编辑器使用
我的博客本来打算使用layui的富文本编辑器,但是出了一个问题,无法获取编辑器内容,我参考官方文档,获取内容也就那几个方法而已,但是引入进去后始终获取的值为空,百度和bing都试过了,但是始终还是获取 ...
- Maven的继承以及import作用域
Maven的pom文件中可继承的元素包括: groupId:项目ID,项目坐标核心元素 version:项目版本 description:描述信息 organization:组织信息 inceptio ...
- [第二届构建之法论坛] 预培训文档(Java版)
本博客是第二届构建之法论坛暨软件工程培训活动预培训文档中[适用于结对编程部分的Java版本],需要实验者有一部分Java基础. 目录 Part0.背景 Part1.配置环境 配置JDK Linux 平 ...