欢迎来到天天文库
浏览记录
ID:44256998
大小:190.50 KB
页数:6页
时间:2019-10-20
《深入研究线程池》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、什么是线程池?诸如web服务器、数据库服务器、文件服务器和邮件服务器等许多服务器应用都而向处理來自某些远程來源的人量短小的任务。构建服务器应川程序的一个过于简单的模型是:每当一个请求到达就创建一个新的服务对象,然后在新的服务对象吐璽幽当冇人量请求并空驛対象的开销很大。所以■的-个手段就是特别是-些很耗资源的对象创建和销毁,这样就引入了“池”的概念,“池”的概念使得人们可以定制一定量的资源,然后对这些资源进行复川,而不是频繁的创建和销毁。线程池是预先创建线程的•种技术。线程池在还没有任务到來之前,创建一定数量的线程,放入空闲队列中。这些线程都
2、是处于睡眠状态,即均为启动,不消耗CPU,而只是占用较小的内存空间。当请求到來之后,缓冲池给这次请求分配一个空闲线程,把请求传入此线程屮运行,进行处理。当预先创建的线程都处于运行状态,即预制线程不够,线程池可以自由创建一定数量的新线程,川于处理更多的请求。当系统比较闲的时候,也可以通过移除一部分一直处于停用状态的线程。虽然线程池是构建多线程应用程序的强大机制,但使用它并不是没有风险的。在使用线程池时需■线程池人小与性能的关系,注意并发风险、死锁、资源不足和线程泄漏等问题。(1)线程池人小。多线程应用并非线程越多越好,需要根据系统运行的软硬件
3、坏境以及应用木身的特点决定线程池的大小。一般来说,如果代码结构合理的话,线程数忖与CPU数量相适合即口J。如果线程运行时口J能出现阻塞现彖,可相应增加池的大小;如冇必要可采川自适应算法来动态调整线程池的人小,以提高CPU的冇效利用率和系统的整体性能。(2)并发错误。多线程应川要特别注意并发错误,要从逻辑上保证程序的正确性,注意避免死锁现彖的发生。(3)线程泄漏。这是线程池应用屮一个严重的问题,当任务执行完毕而线程没能返回池屮就会发牛线程泄漏现象。简单线程池的设计一个典型的线程池,应该包括如下儿个部分:1、线程池管理器(ThreadPool)
4、,用于启动、停用,管理线程池2、工作线程(WorkThread),线程池中的线程3、请求接口(WorkRequest),创建请求対象,以供工作线程调度任务的执行4、诘求队列(RequestQueue),用于存放和提収请求5、结果队列(ResultQueue),用于存储请求执行后返冋的结果线程池管理器,通过添加请求的方法(putRequest)向请求队列(RequestQueue)添加请求,这些请求事先碍要实现请求接口,即传递工作函数、参数、结果处理函数、以及异常处理函数。Z后初始化一定数虽的工作线程,这些线程通过轮询的方式不断查看请求队列(
5、RequestQueue),只要有请求存在,则会提取出请求,进行执行。然后,线程池管理器调用方法(poll)查看结果队列(resu11Queun果冇值,则取出,调用结果处理函数执行。通过以」二讲述,不难发现,这个■在于请求队列和结果队列,工作线程通过伦询requestQueue获得任务,主线程通过查看结來队列,获得执行结果。因此对这个队列的设计,要实现线程同步,以及一定阻塞和超时机制的设计,以防止因为不断轮询而导致的过多cpu开销。在本文小,将会用python语言实现,python的Queue,就是很好的实现了对线程同步机制。任务工作作业j
6、avalistinterface深入研究线程池一•什么是线程池I?线程池就是以一个或多个线程[循环执行]多个应用逻辑的线程集合.注意这里用了线程集合的概念是我生造的,目的是为了区分执行一批应用逻辑的多个线程和线程组的请参阅慕础部分.一般而言h程池有以下几个部才:1•完成主要任务的一个或多个线程.2.用于调度管理的管理线程.3.要求执行的任务队列.那么如果一个线程循环执行一段代码是否是线程池?如果极端而言,应该算,但实际上循环代码应该算上一个逻辑单元•我们说最最弱化的线程池应该是循环执行多个逻辑单元.也就是有一批要执行的任务,这些任务被独立为
7、多个不同的执行单元上匕如:intx=0;while(true){x++;}这就不能说循环中执行多个逻辑单元,因为它只是简单地对循环外部的初始变量执行++操作.而如果己经有一个队列ArrayListal=newArrayList();for(inti=0;i<10000;i++){al.add(newACIass());}然后在一个线程中执行:while(al.size()!=0){ACIassa=(ACIass)al.remove(O);a.businessMethod();}我们说这个线程就是循环执行多个逻辑单元.可以说这个线程是弱化的线
8、程池.我们习惯上把这些色翌空詈空型诸任务.〔•为什么要创建线程池?线程池属于对象池.所有对象池都具有一个非常重要的共性,就是为了最人程度复用对象.那么线程池的最成要的特征也就是最
此文档下载收益归作者所有