- 1、本文档共29页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
java线程池
基于生产-消费者模式的任务异步线程池设计与实现
有些童鞋可能会说,在JDK1.5后就带了ExecutorService这样的线程池,干嘛还自己实现啊?这里,我就先简单说一下背景情况和设计的思路先。
?1. JDK的ExecutorService中的线程池只是提供了一些基础的实现,进入线程池的任务一般有两种行为:阻塞或者激活新的线程,前者是对于fixedThreadPool而言,而后者是对于cachedTreadPool。而项目需要的是一个具有伸缩性的。这里包括两个方面,一个是伸缩性的工作线程池(可以根据情况对线程池进行自我调节),二是伸缩性的任务队列(具有固定的大小,多余的任务会被暂时转储,而队列空闲至一个阈值时,从恢复转储的任务)。Commons-pool其实实现了第一个需求,但是它在设计上是存在一些问题,并不太适合用于线程池的管理(改篇可以再行讨论)。
2. 对于任务队列好,对于工作线程好,一个具有良好设计组件的前提是还有这么几个需求的:它自身是可以被Audit,也就是它的性能,实际工作质量是可以被检查和评估的;它的行为是可以被扩展的;它必须是健壮的并且可控的。所以,除了生产-消费者的线程池外,还必须有一些管理线程,它们必须能够良好地反馈和控制线程池;其次对于整个组件的活动必须定义一套事件以及事件监听机制,其目标一是能做到组件状态的自省,二是能提供客户端的扩展(比如实现动态任务链等)。
?
?? ?好了,谈了背景,先简单减少一下组件中几个主要角色的构成吧(因为整个组件约有60个类,所以不可能全部说明和贴出来):
1. WorkEngine: 除了继承Switchable这一一个控制开关外,它包括三个主要组成部分和三个扩展部分。
?? ?三个组成部分也就是组件的核心:任务队列、工作线程代理、任务结果处理队列。
?? ?三个扩展部分分别是:配置、持久化接口以及控制钩子接口。
?
Java代码?
public?interface?Switchable?{??
??
????void?cancelWork()?;??
??
????String?getId()?;??
??
????boolean?isStartForWork()?;??
??
????void?startWork()?;??
??
????void?stopWork()?;??
}??
??
public?interface?WorkEngine?extends?Switchable?{??
??
????void?addControlHook(Switchable?hook)?;??
??
????WorkConfiguration?getConfiguration()?;??
??
????Persistence?getPersistence()?;??
??
????TaskReportQueue?getReportQueue()?;??
??
????TaskQueue?getTaskQueue()?;??
??
????WorkerBroker?getWorkerBroker()?;??
??
}??
?
?2. 下面对三个主要的部件接口简单说明下:
?? ?首先是任务队列TaskQueue,相对于传统的队列,增加了事件监听器和任务优先级重处理。
?
Java代码?
public?interface?TaskQueue?extends?IterableTask?{??
??
????void?addEventListener(TaskEventListener?listener)?;??
??
????/**?
?????*?add?a?new?task?to?tail?of?queue?
?????*?@param?task?
?????*/??
????void?addTask(Task?task)?;??
??
????/**?
?????*?check?whether?existing?task?in?queue.?
?????*?@return?
?????*/??
????boolean?existTask()?;??
??
????/**?
?????*?sort?tasks?in?queue?according?to?priority?
?????*/??
????void?sequence()?;??
??
????/**?
?????*?remove?the?task?at?the?head?of?queue?
?????*/??
????Task?removeTask()?;??
??
????/**?
?????*?remove?the?indicated?task?in?queue?
?????*?@param?task?
?
文档评论(0)