如何应用线程池技术以提高系统对线程响应的效率
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1)在开发编程时,一般都是把一个长任务拆分为一系列 的小任务,每个任务由一个线程来完成,然后再提交 给一个Executor对象中的execute()方法去执行。 2)而Executor在执行时是使用系统内部所创建出的线程 池来完成对应的任务操作。
6、如何应用Executors类创建线程池
在Executors类中提供了一系列的工厂方法可用于创建线程 池来自百度文库而返回的线程池都实现了ExecutorService接口。
7、java.util.concurrent.ThreadPoolExecutor类 (1)ThreadPoolExecutor类的定义
1)ThreadPoolExecutor继承了AbstractExecutorService, 而后者又实现了ExecutorService接口,同时 ExecutorService又是Executor的子接口。 2)也就是说ThreadPoolExecutor其实也是一个Executor接 口的实现类。
2)如何减少对象创建和销毁时所耗费的系统性能?应用缓 存或者池等技术。
(2)引入线程池的主要目的 1)引入线程池可以避免重复地创建和销毁线程而给系统带来 的负担,节省了每次启动线程的资源开销。线程池是管理线 程的高级技术。 2)应用线程池技术能有效减少多线程环境中资源的消耗,可 以提高系统的处理能力。因此现在的服务器程序中大量应 用线程池技术。
如何应用线程池技术 以提高系统对线程响应的效率
1、常规Socket编程实现中所存在的问题
(1)常规的Socket服务器端的线程响应过程 建立监听端口、发现有新连接时将接受该客户端的新连接 ,然后再启动一个新的线程,并执行该服务线程,服务响应处 理过程完毕后再关闭线程。 (2)主要的问题 1)当然,这样的响应模型在客户的请求数量比较少的情况 下是没有什么问题的,但是对需要频繁处理用户请求而每 次请求需要的服务又是短暂的客户请求时,服务器系统会 将大量的时间花费在线程的创建和销毁。 2)在Java 5中新增的线程池技术的支持则能够克服这些缺 点,通过对已经创建出的线程加以重用来执行多个任务, 可以避免频繁地对线程的创建与销毁等方面的系统开销, 使得服务器的性能方面得到很大提高。
8、应用ThreadPoolExecutor类的代码示例
9、线程池的创建和应用的代码示例
(1)功能实现的需求 某个软件企业通过招标获得了一些软件开发的项目,而当 这些软件项目开发完毕后才可以继续下一轮的软件项目的招标 活动。下面为模拟实现该功能的程序实例,其中应用了线程池 相关的实现技术。 (2)软件项目任务 JavaSoftWareProje ct类的代码实例
如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。 如果此时线程池中的数量大于corePoolSize,缓冲队列 workQueue满,并且线程池中的数量小于maximumPoolSize,创建 新的线程来处理被添加的任务。
如果此时线程池中的数量大于corePoolSize,缓冲队列 workQueue满,并且线程池中的数量等于maximumPoolSize,那 么通过 handler所指定的策略来处理此任务。 因此,调度的策略和处理任务的优先级为: 1)核心线程corePoolSize、任务队列workQueue、最大线 程maximumPoolSize; 2)如果三者都满了,使用handler处理被拒绝的任务;但 当线程池中的线程数量大于 corePoolSize时,如果某线程空闲 时间超过keepAliveTime,线程将被终止。 3)这样,线程池可以动态的调整池中的线程数。
2、改进的Socket服务器响应模式
(1)建立监听端口、创建线程池; (2)发现有新的客户端的Socket连接,则使用在线程池中已经 创建好的线程来执行该客户的请求的服务任务; (3)服务完毕,释放线程到线程池中。
3、线程池技术
(1)如何减少对象创建和销毁时所耗费的系统性能 1)在面向对象编程中,创建和销毁对象是很费时间的,因 为创建一个对象要获取内存资源或者其它更多资源。
(3)引入线程池通常提供了如下功能 1)通过对线程的管理,能够更加合理地调配资源——因为在 线程池中维护着一组空闲的线程,并向外提供服务,而且 还可以根据系统繁忙的程度而相应地动态增加或减少空闲 线程的数量、提供自动检测异常线程的功能。 2)通过维护池中既存线程,可以节省创建线程的开销,尤其 是对于Web Server这类处理频繁请求,而处理过程又比较 快的客户端请求的程序,创建线程时所耗费的系统开销是 不能忽略的。
4、Java5以上版本中增加了新的并发类库 java.util.concurrent包
在该类库中为并发人员提供了丰富的API,使得多线程编程 在Java 5中更加容易,灵活。
5、Executor框架
它是指在Java5以上版本中引入的一系列并发库中与 Executor相关的一些功能类,其中包括对线程池技术的支持功 能类——Executor、Executors,ExecutorService和 CompletionService、Future、Callable等。
(2)调度的策略 1)开发人员将一个任务通过 execute(Runnable)方法被添加 到线程池——所谓的任务也就是一个 Runnable类型接口的 实现类的对象,任务的执行方法就是 Runnable类型对象中 的run()方法。
2)当一个任务通过execute(Runnable)方法欲添加到线程池 时,如果此时线程池中的数量小于corePoolSize,即使线 程池中的线程都处于空闲状态,也要创建新的线程来处理 被添加的任务。
(3)模拟软件项目管理协调者的 AllJavaSoftwareProjectLeader类代码实例
(4)模拟软件企业的JavaSoftWareCompany类的代码示例
(5)本实例程序的最终执行的结果