- 浏览: 752619 次
- 性别:
- 来自: 北京
-
文章分类
- 全部博客 (1081)
- [网站分类]1.首页原创精华.NET区(包含架构设计、设计模式)(对首页文章的要求:原创、高质量、经过认真思考并精心写作) (0)
- [网站分类]2..NET新手区(用于发表不合适发表在首页的.NET技术文章,包括小经验、小技巧) (1)
- [网站分类]3.非技术区(技术之外的文章,但不要涉及任何政治内容) (0)
- [网站分类]4.其他技术区 (0)
- [网站分类]5.企业信息化 (0)
- [网站分类]6.读书心得区(技术书籍阅读心得、书籍推荐) (0)
- [网站分类]7.提问区(.NET技术方面的提问) (2)
- [网站分类]8.技术转载区(.NET技术文章转载, 请注明原文出处) (0)
- [网站分类]9.求职招聘区(个人求职、企业招聘) (0)
- [网站分类]Dottext区 (0)
- [网站分类]GIS技术 (0)
- [网站分类]IT英才专区(IT职场交流) (0)
- [网站分类]SharePoint (0)
- [网站分类]博客园.NET俱乐部(俱乐部组织与活动方面的文章) (0)
- [网站分类]软件发布区(发布自己开发的代码、软件) (0)
- [网站分类]网站管理区(网站管理方面的疑问、建议、意见, 寻求管理员帮助) (0)
- [网站分类]业界新闻 (1)
- 技术 (1)
- [随笔分类]生活感悟 (10)
- [随笔分类]C# (30)
- [随笔分类]AjaxPro教程 (3)
- [发布至博客园首页] (5)
- [随笔分类]简历 (0)
- [随笔分类]Linux (2)
- [随笔分类]技术聚会 (2)
- [随笔分类]ORM (1)
- [随笔分类]php (1)
- [随笔分类]创业 (1)
- [随笔分类]奇技淫巧 (1)
- [随笔分类]计划 (1)
- [随笔分类]架构&分层 (1)
- [随笔分类]整合行销 (1)
- [随笔分类]mac (1)
- [网站分类].NET新手区 (45)
- [网站分类]非技术区 (5)
- [网站分类]招聘区 (0)
- [随笔分类]单元测试 (1)
- [网站分类]其他技术区 (3)
- [网站分类]代码与软件发布 (6)
- [网站分类]提问区 (24)
- [随笔分类]ASP.NET (2)
- [随笔分类]FAQ (12)
- [随笔分类]开发人员工具 (1)
- [随笔分类]朗志轻量级项目管理解决方案 (1)
- [网站分类]读书区 (1)
最新评论
-
天使建站:
写和乱七八糟的 不知道从哪复制过来的 还是看这里吧j ...
jquery数组 -
hyn450:
你好,我最近也想了解一下竞争情报。不知道能不能交流一下呢 ?
最近的工作 -
lattimore:
这个连接打不开了阿!
使用vnc连ubuntu desktop -
MZhangShao:
奉劝你一句,以后在Ubuntu 用apt-get安装成功的软件 ...
关于xrdp的安装设置 -
f002489:
strftime
python下datetime类型的转换
需求:
有一种任务需要定时的执行,而且非常的耗时,因此我把它放到线程池中执行,并设置线程池为1,如果该任务已经在队列中或正在执行该任务,则不要再将该任务加入线程池中了。
测试代码如下
<!----> 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading;
6 using ThreadPool2;
7
8 namespace ThreadPoolTest.MyThreadPool2Test
9 {
10 class Class6
11 {
12 static void Main(string[] args)
13 {
14 MyThreadPool2 pool=new MyThreadPool2(1,true,30000);
15 object obj=new object();
16 Random rnd=new Random();
17 for (var i = 0; i < 20;i++ )
18 pool.QueueUserWorkItem(call, obj, rnd.Next(1,4).ToString(), succ, err);
19 Console.ReadLine();
20 }
21
22 private static void err(object state)
23 {
24 Console.WriteLine("err
");
25 }
26
27 private static void succ(object state, object result)
28 {
29 Console.WriteLine("succ
");
30 }
31
32 private static object call(object state)
33 {
34 while(true)
35 {
36 Thread.Sleep(2000);
37 Console.WriteLine("exec
");
38 }
39 }
40 }
41 }
42
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading;
6 using ThreadPool2;
7
8 namespace ThreadPoolTest.MyThreadPool2Test
9 {
10 class Class6
11 {
12 static void Main(string[] args)
13 {
14 MyThreadPool2 pool=new MyThreadPool2(1,true,30000);
15 object obj=new object();
16 Random rnd=new Random();
17 for (var i = 0; i < 20;i++ )
18 pool.QueueUserWorkItem(call, obj, rnd.Next(1,4).ToString(), succ, err);
19 Console.ReadLine();
20 }
21
22 private static void err(object state)
23 {
24 Console.WriteLine("err

25 }
26
27 private static void succ(object state, object result)
28 {
29 Console.WriteLine("succ

30 }
31
32 private static object call(object state)
33 {
34 while(true)
35 {
36 Thread.Sleep(2000);
37 Console.WriteLine("exec


38 }
39 }
40 }
41 }
42
线程池代码如下,
<!---->
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using Amib.Threading.Internal;
using Rhino.Commons;

namespace ThreadPool2


{
public delegate object WaitCallback2(object state);
public delegate void SuccCallback(object state, object result);
public delegate void ErrCallback(object state);

/**//// <summary>
/// 此线程池的作用是将某一类特殊的任务交给此线程池执行,
/// 可以设定该线程池的最大线程数,
/// 这类线程池的优点时,占用的资源少,优先级低,
/// 适合于执行任务需要长期执行,不考虑时间因素的任务
/// 同时根据在传入线程池时的标记key,可以Aborted指定任务,
/// 若该任务正在执行或尚在执行队列中
/// </summary>
public class MyThreadPool2

{

/**//// <summary>
/// 任务执行队列
/// </summary>
//static ThreadSafeQueue<WorkerThread> queue = new ThreadSafeQueue<WorkerThread>();
List<WorkerThread> queue = new List<WorkerThread>();

/**//// <summary>
/// 目前暂定为只使用一个线程,以免耗近资源
/// </summary>
SynchronizedDictionary<string, WorkerThread> dict = new SynchronizedDictionary<string, WorkerThread>();
private object state;
AutoResetEvent wait = new AutoResetEvent(false);
AutoResetEvent wait2 = new AutoResetEvent(false);

private int MaxLimitedTime
{ get; set; }

private bool IsLimitedExecTime
{ get; set; }

private int IdleTimeout
{ get; set; }
//private static int _maxThreadNum = 1;
private int MaxThreadNum

{
//get { return _maxThreadNum; }
//set { _maxThreadNum = value; }
get;
set;
}
private MyThreadPool2()

{
//System.Threading.ThreadPool.RegisterWaitForSingleObject(wait, new WaitOrTimerCallback(aa), state, 2000,true);
//SetMaxThreadNum(2);
//SetMaxExecTime(false, 10000);
}

/**//// <summary>
/// 设置专用线程池的初始参数
/// </summary>
/// <param name="num">线程池的最大线程数,最小为1</param>
/// <param name="b">是否起用限制最大单个任务执行时间设定</param>
/// <param name="MaxLimitedTime">单个任务执行的最大时间</param>
public MyThreadPool2(int num, bool b, int MaxLimitedTime)

{
System.Threading.ThreadPool.RegisterWaitForSingleObject(wait, new WaitOrTimerCallback(aa), state, 2000, true);
if (num < 1)
num = 1;
MaxThreadNum = num;
IsLimitedExecTime = b;
this.MaxLimitedTime = MaxLimitedTime;
if (IsLimitedExecTime)
System.Threading.ThreadPool.RegisterWaitForSingleObject(wait2, new WaitOrTimerCallback(bb), state,
this.MaxLimitedTime, true);
}


/**//// <summary>
/// 定时将队列中的数据装载到线程中执行,如果还没有到达最大线程数还有任务则创建线程
/// </summary>
/// <param name="state"></param>
/// <param name="timedOut"></param>
private void aa(object state, bool timedOut)

{
//Console.WriteLine("执行aa()将队列中的任务加到线程中");

lock(WorkerThread.Manual)
{
WorkerThread.Manual.Reset();
lock (queue)

{
Console.WriteLine("queue count={0}",queue.Count);
//判断任务队列中有无积压的任务且有无空闲的线程,如果符合上述条件则执行之
List<string> removeKey = new List<string>();
List<WorkerThread> newTask = new List<WorkerThread>();
List<string> tasks = new List<string>();
//Dictionary<string,WorkerThread> addDict=new Dictionary<string, WorkerThread>();
foreach (var kvp in dict)

{//kvp.Value.ThreadState == ThreadState.Unstarted ||
//if (kvp.Value.Thread.ThreadState == ThreadState.Suspended)

//将不活动的线程记录下来并移除
if (!kvp.Value.Thread.IsAlive)
tasks.Add(kvp.Key);
//将活动且空闲的线程赋于新的任务
if (kvp.Value.Thread.IsAlive == true && kvp.Value.CurrentThreadState == WorkerThreadState.Idle)




































































































































发表评论
-
请教一个winform程序设计上的问题
2007-07-12 02:22 734想要做一个功能,点击按钮出现一个键菜单,如下图所示:而在我的程 ... -
模拟提交程序相关专题
2007-11-29 18:53 974目录 模拟提交程序相关专题 1 目录 ... -
如何使用树形控件
2007-11-29 18:58 1376目录 如何使用树形控件 1 目录 2 ... -
XML文档数据操作心得
2007-11-29 19:00 808目录 XML文档数据操作心得 1 修订历史纪录 ... -
自制线程池3续
2008-08-13 13:59 665晚上睡觉前想到一些问题,发现有几种情形没有进行测试,遂记录下来 ... -
刚才是不是访问出问题了
2008-08-14 20:08 650Invalid URL The requested URL & ... -
Mock介绍
2008-08-17 19:48 1056在园子里搜索了一下, ... -
单元测试介绍
2008-08-18 07:25 762希望能不落熟套,在这里记录单元测试使用中的一些技巧 1.刚从英 ... -
最近几天的工作总结
2008-08-21 16:29 684缓存真的很重要,这几天在做信息采集的过程中,需要动态的生成程序 ... -
BDB使用总结
2008-08-24 12:26 752当对数据库设置了DbFlags.Dup后,允许重复的键值, 当 ... -
截图留念
2008-08-28 20:57 390... -
分布式信息采集程序Preview2
2008-08-29 17:17 621http://files.cnblogs.com/lexus/ ... -
boo & python笔记
2008-08-30 21:22 609在这里记录一下,自己的复习所得,有大概一个月没有碰这些东西了, ... -
log4net udp组件的应用
2008-08-30 23:57 788由于输出的调试信息非常之多,加上早前有一些用的是Console ... -
检测你的机子上装了什么版本的.net framework
2009-12-09 09:20 713这个想法由来已久,今天又碰上有人问我这个问题,使出吃奶的劲尔狠 ... -
关于程序日志的设计思考,及写程序时候的心态2009-12-16
2009-12-16 10:00 894最近在写一个分布式缓 ... -
最近几天的工作总结
2008-08-21 16:29 796缓存真的很重要,这几天在做信息采集的过程中,需要动态的生成程序 ... -
BDBViewer
2008-08-23 10:37 599因为项目中用了BDB,可是BDB不像sqlite有众多的数据库 ... -
扩展方法应用
2008-08-23 16:26 737using System; using System.Coll ... -
BDB使用总结
2008-08-24 12:26 775当对数据库设置了DbFlags.Dup后,允许重复的键值, 当 ...
相关推荐
4. **自制线程池**:虽然Java提供内置的线程池实现,但有时根据特定需求,开发者可能需要自定义线程池。自定义线程池可以精确控制线程的数量、工作队列的大小、线程的优先级等,以满足特定性能和资源管理的要求。 5...
开发者可能需要使用到线程池来并发处理多个搜索请求,提高响应速度,同时也要处理好异常情况,保证程序的稳定运行。 在实际使用中,XiLinJieSearch这个名字可能代表了该搜索器的特定版本或作者的标识。用户在使用时...
CLR.via.C#.(中文第3版)(自制详细书签)Part2 CLR via C#(第3版) Jeffrey Richter 著 周靖 译 出版时间:2010年09月 页数:800 介绍 享有全球盛誉的编程专家Jeffrey Richter,这位与Microsoft .NET开发团队...
CLR.via.C#.(中文第3版)(自制详细书签) CLR via C#(第3版) Jeffrey Richter 著 周靖 译 出版时间:2010年09月 页数:800 介绍 享有全球盛誉的编程专家Jeffrey Richter,这位与Microsoft .NET开发团队合作长达...
CLR.via.C#.(中文第3版)(自制详细书签)Part3 CLR via C#(第3版) Jeffrey Richter 著 周靖 译 出版时间:2010年09月 页数:800 介绍 享有全球盛誉的编程专家Jeffrey Richter,这位与Microsoft .NET开发团队合作...
CLR.via.C#.(中文第3版)(自制详细书签)Part2 CLR via C#(第3版) Jeffrey Richter 著 周靖 译 出版时间:2010年09月 页数:800 介绍 享有全球盛誉的编程专家Jeffrey Richter,这位与Microsoft .NET开发团队合作...
6. **并发与多线程**:Java提供了强大的并发处理能力,源代码可能展示了如何处理多线程问题,如同步机制、线程池等。 7. **网络编程**:如果软件涉及网络通信,那么可能会看到Socket编程或者HTTP客户端/服务器端...
根据提供的信息,“Java核心技术,卷1(原书第8版).pdf 中文 自制完整书签”这份资料主要聚焦于Java编程语言的核心概念和技术。由于实际内容并未给出,以下将根据该书可能涵盖的主要章节来推测其核心知识点,并对这些...
`BSerialComs`可能采用了线程池或者事件循环模型来处理串口事件,保证了主线程的流畅运行,避免了因为串口操作阻塞而影响用户体验。此外,多线程还能让程序在等待串口响应时执行其他任务,提高整体效率。 事件驱动...
2. **多线程与并发处理**:为了处理多个用户连接和消息同步,程序需要支持多线程和并发操作,这可能涉及到线程池、锁机制、异步编程模型等概念。 3. **数据库管理**:用户信息、聊天记录等数据通常存储在数据库中,...
【Java咖啡厅系统】是一款基于Java技术开发的自制咖啡厅管理系统,旨在提高咖啡厅的运营效率和服务质量。这个系统集成了订单管理、库存控制、客户关系管理、员工调度等多种功能,为小型咖啡厅提供了一站式的后台解决...
实例132 执行任务(线程池) 378 实例133 碰撞的球(多线程) 382 实例134 钟表(多线程) 387 实例135 模拟生产者与消费者 392 实例136 仿迅雷下载文件 396 第15章 图形编程 403 实例137 多变的按钮 403 ...
实例242 手术任务(线程池) 462 实例243 模拟人工服务台(线程连接池) 466 13.6 线程应用实例 471 实例244 下雪的村庄 472 实例245 小飞侠 474 实例246 飞流直下 477 实例247 多线程断点续传 479 实例248 ...
1.2.2 安装JDK 4 1.2.3 配置环境 5 1.2.4 测试JDK配置是否成功 7 实例1 开发第一个Java程序 7 第2章 Java基础类型与运算符(教学视频:39分钟) 9 2.1 基础类型 9 实例2 自动提升 9 实例3 ...
实例242 手术任务(线程池) 462 实例243 模拟人工服务台(线程连接池) 466 13.6 线程应用实例 471 实例244 下雪的村庄 472 实例245 小飞侠 474 实例246 飞流直下 477 实例247 多线程断点续传 479 实例248 滚动的...
3.3.2线程池. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . 63 3.3.3推荐模式. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . 64 3.4进程间通信只用TCP . . . . . . . . . . ....
1.2.2 安装JDK 4 1.2.3 配置环境 5 1.2.4 测试JDK配置是否成功 7 实例1 开发第一个Java程序 7 第2章 Java基础类型与运算符(教学视频:39分钟) 9 2.1 基础类型 9 实例2 自动提升 9 ...
实例242 手术任务(线程池) 462 实例243 模拟人工服务台(线程连接池) 466 13.6 线程应用实例 471 实例244 下雪的村庄 472 实例245 小飞侠 474 实例246 飞流直下 477 实例247 多线程断点续传 479 实例248 滚动的...