线程池循环执行
来源:互联网 发布:淘宝怎么退订短信 编辑:程序博客网 时间:2024/06/03 20:04
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace ConsoleApplication6{ class Program { static void Main(string[] args) { LockObj lockObjs = new LockObj(); List<Item> fullList = new List<Item>(); fullList.Add(new Item(1, 2, lockObjs)); fullList.Add(new Item(2, 3, lockObjs)); fullList.Add(new Item(3, 2, lockObjs)); fullList.Add(new Item(4, 3, lockObjs)); fullList.Add(new Item(5, 2, lockObjs)); fullList.Add(new Item(6, 3, lockObjs)); fullList.Add(new Item(7, 3, lockObjs)); fullList.Add(new Item(8, 2, lockObjs)); fullList.Add(new Item(9, 3, lockObjs)); fullList.Add(new Item(10, 2, lockObjs)); fullList.ForEach(p => lockObjs.QueuePending.Enqueue(p)); //加监控任务,完全靠监控对象驱动所有的任务 Item monitor = new Item(lockObjs); ThreadPool.QueueUserWorkItem(new WaitCallback(monitor.Monitor), null); Console.Read(); } } public class LockObj { public LockObj() { this.QueuePending = new Queue<Item>(); this.QueueDisabled = new Queue<Item>(); this.ActiveCount = 0; } //正处理队列 public Queue<Item> QueuePending { get; set; } //被禁用队列 public Queue<Item> QueueDisabled { get; set; } /// <summary> /// 活动任务数量 /// </summary> public int ActiveCount { get; set; } } public class Item { #region [属性] public int Flag { get; set; } public int WaitMs { get; set; } public LockObj LockObj { get; set; } public DateTime BeginTime { get; set; } public DateTime EndTime { get; set; } public double ElaspedSeconds { get { return this.EndTime.Subtract(this.BeginTime).TotalSeconds; } } #endregion /// <summary> /// 监控用构造函数 /// </summary> /// <param name="_LockObj"></param> public Item(LockObj _LockObj) { this.LockObj = _LockObj; } /// <summary> /// 普通任务用的构造函数 /// </summary> /// <param name="_Flag"></param> /// <param name="_WaitSeconds"></param> /// <param name="_LockQueues"></param> public Item(int _Flag, int _WaitSeconds, LockObj _LockObj) { this.Flag = _Flag; this.WaitMs = _WaitSeconds * 1000; this.LockObj = _LockObj; } public void Monitor(object obj) { lock (this.LockObj) { //如果有禁用的,将其加入到等待列表队尾 if (this.LockObj.QueueDisabled.Count > 0) { for (int i = this.LockObj.QueueDisabled.Count - 1; i >= 0; i--) { Item item = this.LockObj.QueueDisabled.Dequeue(); this.LockObj.QueuePending.Enqueue(item); Console.WriteLine("Move Item {0} Form QueueDisabled To QueuePending", item.Flag); } } //如果数量不够,则将等待列表中的加到执行列表 if (this.LockObj.ActiveCount < 2) { int maxNum = 2 - this.LockObj.ActiveCount; for (int i = 0; i < maxNum; i++) { Item item = this.LockObj.QueuePending.Dequeue(); ThreadPool.QueueUserWorkItem(new WaitCallback(item.Exec), null); } this.LockObj.ActiveCount = 2; } } Thread.Sleep(1000); ThreadPool.QueueUserWorkItem(new WaitCallback(this.Monitor), null); } public void Exec(object obj) { this.BeginTime = DateTime.Now; Thread.Sleep(this.WaitMs); this.EndTime = DateTime.Now; Console.WriteLine("Flag:{0}, BeginTime:{1:HH:mm:ss,ms}, EndTime: {2:HH:mm:ss,ms}, ElapsedSeconds:{3}" , this.Flag < 10 ? " " + this.Flag.ToString() : this.Flag.ToString() , this.BeginTime , this.EndTime , this.ElaspedSeconds ); lock (this.LockObj) { //模拟此对象可能遇到了异常情况 //异常则将此对象放入到禁用队列 if (new Random().Next(0, 10) < 2) { Console.WriteLine("Item : {0} is Disabled.", this.Flag); this.LockObj.QueueDisabled.Enqueue(this); } //无异常则将此对象加入到队尾 else { this.LockObj.QueuePending.Enqueue(this); } //从队首取出对象执行 Item itemExec = this.LockObj.QueuePending.Dequeue(); ThreadPool.QueueUserWorkItem(new WaitCallback(itemExec.Exec), null); } } }//end of class Item }//end of namespace
阅读全文
0 0
- 线程池循环执行
- Java线程循环顺序执行
- 让线程池依次无限循环执行下去
- 循环线程和Handler消息执行
- 子线程主线程循环交替执行
- 两个线程执行生产 * 两线程执行消费 * 依次交替循环
- 循环执行
- 线程执行N次后,进程执行M次,如此循环S次
- 线程池中捕获线程执行异常
- java 等待线程/线程池执行完毕
- 线程池任务执行流程
- Spring线程池执行任务
- 线程池ThreadPoolExecutor执行流程
- java 线程池批量执行
- 线程池的执行流程
- 循环线程
- 第十天 :让一线程执行10次,然后让二线程执行10,然后一执行,二执行,这样循环50次,编写程序
- 线程执行
- MySQL:查看sql语句运行时间
- myBatis中xml配置方式使用constructo配置字段
- 兼容各种浏览器的图片垂直居中CSS解决方案
- oracle 删除某一个用户底下所有的表数据
- pomelo 部署在外网服务器步骤
- 线程池循环执行
- CodeIgniter框架优化-Session支持SASL 用户名密码认证
- 邓宁-克鲁格效应
- Appium 常见问题总结
- ajax实现文件上传进度条
- HC-05蓝牙模块与电脑通信
- 01. JDBC 简介
- 【笨鸟先飞】Java重新学习日记2---控制流程
- [leetcode]147. Insertion Sort List