- 浏览: 726692 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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.在给线程池派发任务执行完成后,间隔一段时间,再给线程池添加任务看是否正常,根据间隔的时间的长短这里可以分为两种情形,一是复用空闲的线程,另一种是创建线程。
创建线程的情况又分为两种,一种是由于间隔时间过长,系统自动将线程结束了,另一种是线程池设定了最大执行任务时间,虽然间隔的时间不长,但是任务的线程是强制销毁的还是要创建新线程来执行下面的任务。
在测试的时间我发我现一个鬼异的现象,我先把我的测试代码例出来
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using ThreadPool2;
namespace ThreadPoolTest.MyThreadPool2Test
{
class Class3
{
static void Main(string[] args)
{
MyThreadPool2 pool=new MyThreadPool2(1,true,10*1000);
object state=new object();
pool.QueueUserWorkItem(call1,state,succ,err);
Thread.Sleep(80*1000);
pool.QueueUserWorkItem(call1, state, succ, err);
Thread.Sleep(50* 1000);
pool.QueueUserWorkItem(call1, state, succ, err);
Console.ReadLine();
}
private static void err(object state)
{
Console.WriteLine("err");
}
private static void succ(object state, object result)
{
Console.WriteLine("succ");
}
private static object call1(object state)
{
while(true)
{
Console.WriteLine("call1");
Thread.Sleep(2000);
}
}
}
}
这里正常的情况应该是这样,执行单项任务最长为10s,两次向线程池提交任务都会创建新的线程来执行,因为10s,第一项加入线程池的任务是完不成的需要强行销毁线程。所以第二项不能复用第一项的任务。
这里有趣的现象是,我发现第一项任务的执行时间将近20s,而后面第二次加入的任务执行都是标准的10s这个是为什么?
明明设定了最大执行10s,仅是第一次执行任务不是,为什么?
最后我发现的原因是这样,由于实例化线程池时就开始轮询检测是否有超时任务,而此时还没有向线程池中添加任务,当向线程池中添加任务后,轮询到达第一次10s检测时间,而此时任务的执行时间还未到10s,等到第二次轮询到达时才认为任务超时了,所以第一次加入的任务它比后面的任务执行的长间较长,我们可以通过下面的代码来显现我的观点的正确性
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using ThreadPool2;
namespace ThreadPoolTest.MyThreadPool2Test
{
class Class3
{
static void Main(string[] args)
{
MyThreadPool2 pool=new MyThreadPool2(1,true,10*1000);
Thread.Sleep(5000);
object state=new object();
pool.QueueUserWorkItem(call1,state,succ,err);
Thread.Sleep(80*1000);
pool.QueueUserWorkItem(call1, state, succ, err);
Thread.Sleep(50* 1000);
pool.QueueUserWorkItem(call1, state, succ, err);
Console.ReadLine();
}
private static void err(object state)
{
Console.WriteLine("err");
}
private static void succ(object state, object result)
{
Console.WriteLine("succ");
}
private static object call1(object state)
{
while(true)
{
Console.WriteLine("call1");
Thread.Sleep(2000);
}
}
}
}
上图是原来的结果
下图是加了Thread.Sleep(5000)的结果,可以看出,执行的时间少了5s钟,由此可以证明确实是因为记时和任务执行的时间不一致性所引起的。
我本来想改进一下,可后来想了想还是算了,这个问题不大,因为在实际项目中,我们只是要将死亡的任务销毁,我们不需要太过精确,只能执行10分钟,一分也不能多或不能少,差不多就行。
不过等我静下心来,我可以认真的去改进它
发表评论
-
请教一个winform程序设计上的问题
2007-07-12 02:22 712想要做一个功能,点击按钮出现一个键菜单,如下图所示:而在我的程 ... -
模拟提交程序相关专题
2007-11-29 18:53 965目录 模拟提交程序相关专题 1 目录 ... -
如何使用树形控件
2007-11-29 18:58 1356目录 如何使用树形控件 1 目录 2 ... -
XML文档数据操作心得
2007-11-29 19:00 782目录 XML文档数据操作心得 1 修订历史纪录 ... -
刚才是不是访问出问题了
2008-08-14 20:08 639Invalid URL The requested URL & ... -
Mock介绍
2008-08-17 19:48 1041在园子里搜索了一下, ... -
单元测试介绍
2008-08-18 07:25 738希望能不落熟套,在这里记录单元测试使用中的一些技巧 1.刚从英 ... -
最近几天的工作总结
2008-08-21 16:29 667缓存真的很重要,这几天在做信息采集的过程中,需要动态的生成程序 ... -
BDB使用总结
2008-08-24 12:26 730当对数据库设置了DbFlags.Dup后,允许重复的键值, 当 ... -
截图留念
2008-08-28 20:57 381... -
分布式信息采集程序Preview2
2008-08-29 17:17 607http://files.cnblogs.com/lexus/ ... -
boo & python笔记
2008-08-30 21:22 590在这里记录一下,自己的复习所得,有大概一个月没有碰这些东西了, ... -
log4net udp组件的应用
2008-08-30 23:57 764由于输出的调试信息非常之多,加上早前有一些用的是Console ... -
检测你的机子上装了什么版本的.net framework
2009-12-09 09:20 700这个想法由来已久,今天又碰上有人问我这个问题,使出吃奶的劲尔狠 ... -
关于程序日志的设计思考,及写程序时候的心态2009-12-16
2009-12-16 10:00 867最近在写一个分布式缓 ... -
最近几天的工作总结
2008-08-21 16:29 776缓存真的很重要,这几天在做信息采集的过程中,需要动态的生成程序 ... -
BDBViewer
2008-08-23 10:37 590因为项目中用了BDB,可是BDB不像sqlite有众多的数据库 ... -
扩展方法应用
2008-08-23 16:26 714using System; using System.Coll ... -
BDB使用总结
2008-08-24 12:26 751当对数据库设置了DbFlags.Dup后,允许重复的键值, 当 ... -
目前来说比较.net下最好的bdb操作封装(附单元测试)
2008-08-24 15:41 7621using System; 2using Syste ...
相关推荐
3. **线程池**:线程池是一种多线程处理形式,预先创建一定数量的线程,用于处理并发任务。使用线程池可以减少创建和销毁线程的开销,提高响应速度。在Java中,`java.util.concurrent`包下的ThreadPoolExecutor类是...
【标题】"ps3混合自制4.86"与【描述】"ps3混合自制4.86rebug"指的是PlayStation 3游戏主机上的一个自制系统固件更新。这个更新是针对PS3的Rebug团队开发的,Rebug是PS3社区中知名的第三方开发者团队,他们致力于提供...
3. **交互式编辑**:PCB3D库自制版支持实时编辑,允许设计师在3D环境中直接调整元器件位置,观察改动对整体布局的影响,提高设计效率。 4. **碰撞检测**:内置的碰撞检测功能可检测电路板上元器件间的冲突,防止因...
【标题】"自制Pickit3资料"所涉及的知识点主要围绕Pickit3这款微控制器编程器和调试器展开。Pickit3是由Microchip Technology公司推出的一款强大的开发工具,主要用于编程和调试基于PIC微控制器(MCU)的项目。这份...
《CPU自制入门》是一本专为对CPU设计与编程感兴趣的读者准备的经典书籍,它深入浅出地介绍了CPU的内部构造和工作原理,是CPU自制入门的绝佳指导资料。通过阅读这本书,你可以了解到从基础的逻辑门电路到复杂的微处理...
5.11自制固件工具,支持设备iPhone 3GS、iPhone 4、iPhone 4 CDMA、iPhone 4S、iPad 1、iPad 2 Wifi、iPad 2 GSM、iPad 2 CDMA、iPad 2 Wifi, iPad 3 Wifi、iPad 3 Global、iPad 3 CDMA、iPod touch 3G、iPod touch ...
3. **STM32 ST-LINK Utility v4.3.0 setup**:这是STM32 ST-LINK实用程序的安装包,它提供了与自制ST-LINK交互的软件界面,包括编程、调试和固件更新等功能。 4. **st-linkv2_upgrade**:可能是一个固件升级工具或...
自制XILINX FPGA JTAG下载器是一种基于USB to JTAG协议转换芯片的设备,用于对FPGA(Field-Programmable Gate Array)进行编程和调试。这种下载器的核心是FT2232H芯片,它原生提供两路RS232串口功能,但可以通过重新...
标题中的“自制U盘 自制U盘自制U盘”似乎是一个重复的表述,但我们可以理解为这个项目或教程是关于如何自制U盘的。描述部分同样如此,没有提供额外的信息,所以我们主要依赖标签和压缩包内的文件来推断知识点。 ...
3. 音频解码: 为了播放MP3文件,我们需要一个能够解码音频数据的芯片,例如UDA1341、PCM1704或WM8731等。这些芯片可以将数字音频流转换为模拟信号,然后通过耳机或扬声器输出。 4. 存储器: MP3文件存储通常使用...
自制升级小板自制升级小板自制升级小板自制升级小板
下位机由3片单片机组成,分别控制X轴,Y轴,Z轴,下位机开机后自动归零,归零后等待上位机发送命令。线路板最大尺寸180mm X 165mm 钻孔最大尺寸 长0~180mm(X轴),宽0~165mm(Y轴),深0~30mm(Z轴) 超过加工范围...
自制实用编程器是一种创新的硬件项目,旨在为电子爱好者和工程师提供一种经济高效的方式来编程各种芯片。这样的设备通常由一些基本的硬件组件、接口电路和配套的软件组成,能够读写微控制器、闪存和其他类型的可编程...
这里所说的激光扫描测距仪的实质就是3D激光雷达。如上面视频中展现的那样,扫描仪可 以获取各转角情况下目标物体扫描截面到扫描仪的距离,由于这类数据在可视化后看起来像 是由很多小点组成的云团,因此常被称之为:...
《自制轻型飞机图纸Piper J-3 Cub》是一份专为航空爱好者和DIY者提供的详尽指导资料,旨在帮助他们理解并亲手制造Piper J-3 Cub这一经典轻型飞机的全过程。Piper J-3 Cub是二战前后广受欢迎的训练机,以其简单的设计...
3. **使用工具**:利用如Redsn0w、PwnageTool或Sn0wbreeze等越狱工具,这些工具允许用户创建自定义的固件包。它们会将你的SHSH备份与原始固件相结合,生成一个可以绕过Apple验证的固件。 4. **添加自定义组件**:在...
3. **上位机软件开发**:progisp167,8软件的开发涉及到USB通信协议的实现,以确保PC与自制适配器之间的数据交换。 4. **调试与测试**:在硬件和软件完成后,进行严格的测试,包括基本的链路测试、通信速度测试、...
这个版本用稍早的DirectX9 SDK编译,可以不带庞大的DLL文件,建议下载!
单片机C语言程序设计 单片机系统中自制硬件字库的应用(有源码)单片机C语言程序设计 单片机系统中自制硬件字库的应用(有源码)单片机C语言程序设计 单片机系统中自制硬件字库的应用(有源码)单片机C语言程序设计 ...