C# 线程池的使用 终止线程池中的队列
C#的线程池使用起来还是非常简单的,这里记录一下。
根据http://blog.csdn.net/chen_zw/article/details/7939834里的描述这里记录一下C#线程池的特点
- 一个进程有且只能管理一个线程池。
- 线程池线程都是后台线程(即不会阻止进程的停止)
- 每个线程都使用默认堆栈大小,以默认的优先级运行,并处于多线程单元中。超过最大值的其他线程需要排队,但它们要等到其他线程完成后才启动。
- 在CLR 2.0 SP1之前的版本中,线程池中 默认最大的线程数量 = 处理器数 * 25, CLR 2.0 SP1之后就变成了 默认最大线程数量 = 处理器数 * 250,线程上限可以改变,通过使用ThreadPool.GetMax+Threads和ThreadPool.SetMaxThreads方法,可以获取和设置线程池的最大线程数。
- 默认情况下,每个处理器维持一个空闲线程,即默认最小线程数 = 处理器数。
- 当进程启动时,线程池并不会自动创建。当第一次将回调方法排入队列(比如调用ThreadPool.QueueUserWorkItem方法)时才会创建线程池。
- 在对一个工作项进行排队之后将无法取消它。
- 线程池中线程在完成任务后并不会自动销毁,它会以挂起的状态返回线程池,如果应用程序再次向线程池发出请求,那么这个挂起的线程将激活并执行任务,而不会创建新线程,这将节约了很多开销。只有线程达到最大线程数量,系统才会以一定的算法销毁回收线程。
在使用线程池的时候,需要初始化其状态
ManualResetEvent eventX = new ManualResetEvent(false);//表示线程池的状态 false代表非终结状态
根据https://www.cnblogs.com/tianboblog/p/5393444.html介绍:
当初始化为true时,为终止状态
static ManualResetEvent _mre = new ManualResetEvent(true);当初始化为false时,为非终止状态
static ManualResetEvent _mre = new ManualResetEvent(false);终止状态时WaitOne()允许线程访问下边的语句
非终止状态时WaitOne()阻塞线程,不允许线程访问下边的语句
把非终止状态改为终止状态用Set()方法
把终止状态改为非终止状态用Reset()方法
//按钮事件
private void btnBatchSend_Click(object sender, RoutedEventArgs e)
{
eventX.Reset();
ThreadPool.SetMinThreads(1, 1);//设置线程池在新请求预测中维护的空闲线程数
ThreadPool.SetMaxThreads(10,10);//设置可以同时处于活动状态的线程池的最大请求数目
以上两句必须都有才行
//循环设置执行对象,
for (int i = 0; i < list.Count; i++)
{
ThreadPool.QueueUserWorkItem(tranSend, oj);//
}
eventX.WaitOne();//当是非终结状态时,会阻塞主线程
eventX.Reset();//设置为非终结状态
}
worker.RunWorkerCompleted += (o, ea) =>
{
//sb.Append("主线程执行完毕");
//this.txt_cansole.Text = sb.ToString();
this.btnBatchCheck.IsEnabled = true;
this.btnBatchSend.Visibility = Visibility.Visible;
this.btnStopSend.Visibility = Visibility.Collapsed;
};
this.btnBatchCheck.IsEnabled = false;
this.btnBatchSend.Visibility = Visibility.Collapsed;
this.btnStopSend.Visibility = Visibility.Visible;
worker.RunWorkerAsync();
//每个线程将会执行的任务
private void tranSend(object order)
{
Order s = order as Order;
//当是最后一个order 或者 用户点了停止按钮时
if (s.IsLas || Break)
{
eventX.Set();//当点了停止按钮时,将线程池信号灯状态设置为终结状态这时会通知主线程继续往下执行
return;
}
//真正的执行任务代码
s.SendMessage = ">>";
s.ItemStatus = 1; /
}
可以看出来熟练C#线程池的使用主要是控制好信号灯的状态,当主线程往下执行时,for循环里的代码会很快执行完毕,虽然最多只允许了十个线程同时活动,但十个之后的对象已经加入了队列,需要中断时,需要在执行任务里去自行判断。
if (s.IsLas || Break)
{
eventX.Set();//当点了停止按钮时,将线程池信号灯状态设置为终结状态这时会通知主线程继续往下执行
return;
}
C# 线程池的使用 终止线程池中的队列的更多相关文章
- Java线程池ThreadPoolExecutor使用和分析(三) - 终止线程池原理
相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池Thr ...
- Java实现终止线程池中正在运行的定时任务
源于开发 最近项目中遇到了一个新的需求,就是实现一个可以动态添加定时任务的功能.说到这里,有人可能会说简单啊,使用quartz就好了,简单粗暴.然而quartz框架太重了,小项目根本不好操作啊.当然, ...
- 一个神奇的bug:OOM?优雅终止线程?系统内存占用较高?
摘要:该项目是DAYU平台的数据开发(DLF),数据开发中一个重要的功能就是ETL(数据清洗).ETL由源端到目的端,中间的业务逻辑一般由用户自己编写的SQL模板实现,velocity是其中涉及的一种 ...
- java线程中断和终止线程运行
ava中启动一个线程很容易,通常情况下我们都是等到任务运行结束后让线程自行停止.但有时需要在任务正在运行时取消他们,使得线程快速结束.对此Java并没有提供任何机制.但是我们可以通过Java提供的线程 ...
- 《Java并发编程》之线程中断与终止线程运行
Java中启动一个线程很容易,通常情况下我们都是等到任务运行结束后让线程自行停止.但有时需要在任务正在运行时取消他们,使得线程快速结束.对此Java并没有提供任何机制.但是我们可以通过Java提供的线 ...
- Java终止线程的三种方式
停止一个线程通常意味着在线程处理任务完成之前停掉正在做的操作,也就是放弃当前的操作. 在 Java 中有以下 3 种方法可以终止正在运行的线程: 使用退出标志,使线程正常退出,也就是当 run() 方 ...
- Java多线程并发01——线程的创建与终止,你会几种方式
本文开始将开始介绍 Java 多线程与并发相关的知识,多谢各位一直以来的关注与支持.关注我的公众号「Java面典」了解更多 Java 相关知识点. 线程的创建方式 在 Java 中,用户常用的主动创建 ...
- Android线程管理之ThreadPoolExecutor自定义线程池
前言: 上篇主要介绍了使用线程池的好处以及ExecutorService接口,然后学习了通过Executors工厂类生成满足不同需求的简单线程池,但是有时候我们需要相对复杂的线程池的时候就需要我们自己 ...
- java多线程系类:JUC线程池:03之线程池原理(二)(转)
概要 在前面一章"Java多线程系列--"JUC线程池"02之 线程池原理(一)"中介绍了线程池的数据结构,本章会通过分析线程池的源码,对线程池进行说明.内容包 ...
随机推荐
- javascript中数组的应用总结
最近在总结javascript的相关应用,今天对js中的数组部分进行归纳总结,以便在以后的工作中有所参考. 1.在js中数组的定义方式有两种: var a = [1,2,3,4]; var b = n ...
- mysql数值字符串类型的按照数值进行排序
今天遇到一个问题,就是对mysql数值字符串类型进行排序,在默认情况下使用order by 字段名称 desc/asc 进行排序的时候,mysql进行的排序规则是按照ASCII码进行排序的,并不会自动 ...
- 前端学习(三十一)canvas(笔记)
canvas 画布 画图.做动画.做游戏=========================================== canvas就是新标签 必须获取绘图 ...
- 小白jquery横向菜单弹出菜单制作
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Python3.5-20190513-廖老师-自我笔记-函数式编程
把复杂的任务拆成各个小的函数,通过函数的调用来完成任务.这就是面向过程编程. 高阶函数:就是让函数的参数能够接收别的函数.把函数作为参数传入到另一个函数. 函数名也是变量.和变量用法一样的,指向一个函 ...
- OpenCV常用基本处理函数(5)图像模糊
2D卷积操作 cv.filter2D() 可以让我们对一幅图像进行卷积操作, 图像模糊(图像平滑)使用低通滤波器可以达到图像模糊的目的.这对与去除噪音很有帮助.其实就是去除图像中的高频成分(比如:噪音 ...
- c# 7.0新语法特性
public class NewAtturibute { public void TestFunc() { // 01 Out变量 不用初始化 "; if (int.TryParse(inp ...
- 深入java虚拟机学习笔记(一)
学习java学到最后都要很熟悉jvm,懂得了java的运行机制,查找问题就会很快了,一般我们都是会用,还到不了精通的地步,虽说我也是个多年的java工程师,但也没有很好的掌握jvm,最近换了一 ...
- thinkphp生成二维码
/** * 生成二维码 * @param string $url url连接 * @param integer $size 尺寸 纯数字 */ function qrcode($url,$size=4 ...
- [bzoj3733]Iloczyn 题解(搜索剪枝)
3733: [Pa2013]Iloczyn Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 741 Solved: 217[Submit][Statu ...