选择特殊符号
选择搜索类型
请输入搜索
服务器程序利用线程技术响应客户请求已经司空见惯,可能您认为这样做效率已经很高,但您有没有想过优化一下使用线程的方法。该文章将向您介绍服务器程序如何利用线程池来优化性能并提供一个简单的线程池实现。
1、线程池管理器(ThreadPoolManager):用于创建并管理线程池
2、工作线程(WorkThread): 线程池中线程
3、任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行。
4、任务队列:用于存放没有处理的任务。提供一种缓冲机制。
线程池(英语:thread pool):一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。 例如,线程数一般取cpu数量 2比较合适,线程数过多会导致额外的线程切换开销。
任务调度以执行线程的常见方法是使用同步队列,称作任务队列。池中的线程等待队列中的任务,并把执行完的任务放入完成队列中。
线程池模式一般分为两种:HS/HA半同步/半异步模式、L/F领导者与跟随者模式。
半同步/半异步模式又称为生产者消费者模式,是比较常见的实现方式,比较简单。分为同步层、队列层、异步层三层。同步层的主线程处理工作任务并存入工作队列,工作线程从工作队列取出任务进行处理,如果工作队列为空,则取不到任务的工作线程进入挂起状态。由于线程间有数据通信,因此不适于大数据量交换的场合。
领导者跟随者模式,在线程池中的线程可处在3种状态之一:领导者leader、追随者follower或工作者processor。任何时刻线程池只有一个领导者线程。事件到达时,领导者线程负责消息分离,并从处于追随者线程中选出一个来当继任领导者,然后将自身设置为工作者状态去处置该事件。处理完毕后工作者线程将自身的状态置为追随者。这一模式实现复杂,但避免了线程间交换任务数据,提高了CPU cache相似性。在ACE(Adaptive Communication Environment)中,提供了领导者跟随者模式实现。
线程池的伸缩性对性能有较大的影响。
创建太多线程,将会浪费一定的资源,有些线程未被充分使用。
销毁太多线程,将导致之后浪费时间再次创建它们。
创建线程太慢,将会导致长时间的等待,性能变差。
销毁线程太慢,导致其它线程资源饥饿。
在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁。如何利用已有对象来服务就是一个需要解决的关键问题,其实这就是一些"池化资源"技术产生的原因。比如大家所熟悉的数据库连接池正是遵循这一思想而产生的,本文将介绍的线程池技术同样符合这一思想。
目前,一些著名的大公司都特别看好这项技术,并早已经在他们的产品中应用该技术。比如IBM的WebSphere,IONA的Orbix 2000在SUN的 Jini中,Microsoft的MTS(Microsoft Transaction Server 2.0),COM 等。
如果是水库大坝主要由主坝、副坝、重力坝、正常溢洪道、非常溢洪道、新增非常溢洪道、灵正渠涵管及电站组成。
基本上由以下几部分:1、库体2、制冷机组(压缩机、冷凝器、冷凝风机或者冷却塔等)3、蒸发器4、电控制箱5、膨胀阀6、铜管7、制冷剂,库灯等电器件蓝梦制冷 为您解答您想知道的冷库问题
应用程序可以有多个线程,这些线程在休眠状态中需要耗费大量时间来等待事件发生。其他线程可能进入睡眠状态,并且仅定期被唤醒以轮循更改或更新状态信息,然后再次进入休眠状态。为了简化对这些线程的管理,.NET框架为每个进程提供了一个线程池,一个线程池有若干个等待操作状态,当一个等待操作完成时,线程池中的辅助线程会执行回调函数。线程池中的线程由系统管理,程序员不需要费力于线程管理,可以集中精力处理应用程序任务。
调用QueueUserWorkItem时传入的Object类型参数传递到任务过程,可以通过这种方式来向任务过程传递参数。如果任务过程需要多个参数,可以定义包含这些数据的类,并将其强制转换为Object数据类型。
1、需要大量的线程来完成任务,且完成任务的时间比较短。 WEB服务器完成网页请求这样的任务,使用线程池技术是非常合适的。因为单个任务小,而任务数量巨大,你可以想象一个热门网站的点击次数。 但对于长时间的任务,比如一个Telnet连接请求,线程池的优点就不明显了。因为Telnet会话时间比线程的创建时间大多了。
2、对性能要求苛刻的应用,比如要求服务器迅速响应客户请求。
3、接受突发性的大量请求,但不至于使服务器因此产生大量线程的应用。突发性大量客户请求,在没有线程池情况下,将产生大量线程,虽然理论上大部分操作系统线程数目最大值不是问题,短时间内产生大量线程可能使内存到达极限,并出现"OutOfMemory"的错误。
//线程池示例 usingSystem; usingSystem.Threading;publicclassTest { //存放要计算的数值的字段 staticdoublenumber1=-1; staticdoublenumber2=-1;publicstaticvoidMain() { //获取线程池的最大线程数和维护的最小空闲线程数 intmaxThreadNum,minThreadNum; intportThreadNum; ThreadPool.GetMaxThreads(outmaxThreadNum,outportThreadNum); ThreadPool.GetMinThreads(outminThreadNum,outportThreadNum); Console.WriteLine("最大线程数:{0}",maxThreadNum); Console.WriteLine("最小线程数:{0}",minThreadNum); //函数变量值 intx=15600; //启动第一个任务:计算x的8次方 Console.WriteLine("启动第一个任务:计算{0}的8次方。",x); ThreadPool.QueueUserWorkItem(newWaitCallback(TaskProc1),x); //启动第二个任务:计算x的8次方根 Console.WriteLine("启动第二个任务:计算{0}的8次方根。",x); ThreadPool.QueueUserWorkItem(newWaitCallback(TaskProc2),x); //等待,直到两个数值都完成计算 while(number1==-1||number2==-1); //打印计算结果 Console.WriteLine("y({0})={1}",x,number1 number2); Console.Read(); } //启动第一个任务:计算x的8次方 staticvoidTaskProc1(objecto) { number1=Math.Pow(Convert.ToDouble(o),8); } //启动第二个任务:计算x的8次方根 staticvoidTaskProc2(objecto) { number2=Math.Pow(Convert.ToDouble(o),1.0/8.0); } }
[HostProtection(SecurityAction.LinkDemand,Synchronization=true,ExternalThreading=true)]publicstaticclassThreadPool { [Obsolete("ThreadPool.BindHandle(IntPtr)hasbeendeprecated.PleaseuseThreadPool.BindHandle(SafeHandle)instead.",false),SecurityPermission(SecurityAction.Demand,Flags=SecurityPermissionFlag.UnmanagedCode)] publicstaticboolBindHandle(IntPtrosHandle) { if(osHandle==null){thrownewArgumentNullException("osHandle");} boolflag=false; boolsuccess=false; RuntimeHelpers.PrepareConstrainedRegions(); try { osHandle.DangerousAddRef(refsuccess); flag=BindIOCompletionCallbackNative(osHandle.DangerousGetHandle()); } finally { if(success) osHandle.DangerousRelease(); } returnflag; }
地毯材质及组成部分
地毯材质及组成部分 地毯城 / 2009-12-16 地毯的材料 制造地毯的材料可分为毯面材料、 初级背衬、 防松涂层、 次级背衬及粘合剂。 不同的地毯所 用材料也不同。 1、毯面纤维 用来生产地毯的毯面纤维如前所述,有尼龙、腈纶、丙纶、涤纶等等。其中尼龙适宜匹染, 有优良的抗磨性及良好的回弹性与织纹保持性, 加工成本代, 因而使用量最大。 丙纶价格低, 染色性差,用来制造长绒、紧拈细绒不行,只适用于毛圈结构,如针扎地毯。因此出现了混 纺的毯面纤维,如尼龙与丙纶混纺的毯面纤维。 为了提高地毯的耐污染性和抗静电性, 国外已使用异形空心纤维, 或加入各种添加剂, 如酯 类、酰胺或胺类的多醚衍生物,甚至可混入很细的金属纤维来提高抗静电性。 由于聚丙烯纤维价格低, 抗拉强度、 湿强度、 耐磨性都优良, 所以只要回弹性小和染色性差 的缺陷能加以改进,它作为毯面纤维的潜力很大。 2、初级背衬 初级背衬
投标文件的主要组成部分
投标标书 目录 1、 经济部分 1.1 唱标报告 1.2 报价明细表 2、商务部分 3、技术部分 4、附件 投标方案 1方案的目标 (方案的具体目的,要达到什么效果,形成什么影响等等) 2方案的内容 (列出将要开展的方案项目内容,具体到细节) 3方案的参与者(那些人要参加进来 ,为什么) 4方案实施的方式 (步骤分工资源分配进度安排) 5方案的费用 6实施的进度监督安排 7备用方案 投标文件的主要组成部分 一.投标函 二.法定代表人身份证明 三.授权委托书 四.投标保证金 五.投标报价预算书 5.1 工程预算汇总表 5.2 投标预算书 六.施工组织设计 七.项目管理机构 7.1 项目管理机构组成表 7.2 主要人员简历表 八.资格审查资料 8.1 投标人基本情况表 8.2 银行资信证明 8.3 近年来完成的类似项目情况表 8.4 近年来发生的诉讼及仲裁情况 九.其他材料 投标文件目录: 一
守护线程是特殊的线程,一般用于在后台为其他线程提供服务.
Java中,isDaemon():判断一个线程是否为守护线程.
Java中,setDaemon():设置一个线程为守护线程.
C# 守护线程
类1:守护线程类
/** * 本线程设置了一个超时时间 * 该线程开始运行后,经过指定超时时间, * 该线程会抛出一个未检查异常通知调用该线程的程序超时 * 在超时结束前可以调用该类的cancel方法取消计时 * @author solonote */public class TimeoutThread extends Thread{ /** * 计时器超时时间 */ private long timeout; /** * 计时是否被取消 */ private boolean isCanceled = false; /** * 当计时器超时时抛出的异常 */ private TimeoutException timeoutException; /** * 构造器 * @param timeout 指定超时的时间 */ public TimeoutThread(long timeout,TimeoutException timeoutErr) { super(); this.timeout = timeout; this.timeoutException = timeoutErr; //设置本线程为守护线程 this.setDaemon(true); } /** * 取消计时 */ public synchronized void cancel() { isCanceled = true; } /** * 启动超时计时器 */ public void run() { try { Thread.sleep(timeout); if(!isCanceled) throw timeoutException; } catch (InterruptedException e) { e.printStackTrace(); } } }
(1)创建线程
当创建一个新的进程时,也创建一个新的线程,进程中的线程可以在同一进程中创建新的线程。
(2)终止线程
可以正常终止自己,也可能某个线程执行错误,由其它线程强行终止。终止线程操作主要负责释放线程占有的寄存器和栈
(3)阻塞线程
当线程等待每个事件无法运行时,停止其运行。
(4)唤醒线程
当阻塞线程的事件发生时,将被阻塞的线程状态置为就绪态,将其挂到就绪队列。进程仍然具有与执行相关的状态。例如,所谓进程处于“执行”状态,实际上是指该进程中的某线程正在执行。对进程施加的与进程状态有关的操作,也对其线程起作用。例如,把某个进程挂起时,该进程中的所有线程也都被挂起,激活也是同样。
在多线程OS中,通常是在一个进程中包括多个线程,每个线程都是作为利用CPU的基本单位,是花费最小开销的实体。线程具有以下属性。
1)轻型实体
线程中的实体基本上不拥有系统资源,只是有一点必不可少的、能保证独立运行的资源。
线程的实体包括程序、数据和TCB。线程是动态概念,它的动态特性由线程控制块TCB(Thread Control Block)描述。TCB包括以下信息:
(1)线程状态。
(2)当线程不运行时,被保存的现场资源。
(3)一组执行堆栈。
(4)存放每个线程的局部变量主存区。
(5)访问同一个进程中的主存和其它资源。
用于指示被执行指令序列的程序计数器、保留局部变量、少数状态参数和返回地址等的一组寄存器和堆栈。
2)独立调度和分派的基本单位。
在多线程OS中,线程是能独立运行的基本单位,因而也是独立调度和分派的基本单位。由于线程很“轻”,故线程的切换非常迅速且开销小(在同一进程中的)。
3)可并发执行。
在一个进程中的多个线程之间,可以并发执行,甚至允许在一个进程中所有线程都能并发执行;同样,不同进程中的线程也能并发执行,充分利用和发挥了处理机与外围设备并行工作的能力。
4)共享进程资源。
在同一进程中的各个线程,都可以共享该进程所拥有的资源,这首先表现在:所有线程都具有相同的地址空间(进程的地址空间),这意味着,线程可以访问该地址空间的每一个虚地址;此外,还可以访问进程所拥有的已打开文件、定时器、信号量机构等。由于同一个进程内的线程共享内存和文件,所以线程之间互相通信不必调用内核。