- 1、本文档共14页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Java中挂起线程检测和处理之道
对于使用SNMP, Q3或Telnet等接口接入设备的软件开发而言,常常会遇到挂起线程
挑战。这一问题不止出现在网络管理中,还出现在Web服务器,激活远程进程调用的进程等。
线程会向设备发出机制请求以检测设备是否正常响应或只是部分响应。在某些案例中,
特定操作可以检测到这样的挂起。而这类特定操作要么是重新试验,要么是告诉终端用户任
务失败,或者是提供其他恢复选项。还有一些案例中,多个任务的大量数据必须通过一个组
件触发给大量电路元件,挂起线程检测很重要以至于它不会成为其他任务处理的瓶颈。所以
挂起线程的管理可分为两个方面:性能和通知。
通知方面,我们可以制定Java Observer 模式来适应多线程。
为多线程系统制订Java Observer模式
由于任务被挂起,所以使用带有适应策略的JavaThreadPool类是第一个能想到的方案。
不过,在一些随机挂起一段时间的线程语境中使用JavaThreadPool会出现一些基于特殊策
略的意外行为,如固定线程池策略的线程短缺。这主要是由于JavaThreadPool不具备检测
线程挂起的机制。
我们可以尝试一下缓冲线程池,不过问题仍然存储。如果任务触发率高,而且有线程被
挂起,那么线程数量会激增。最后,会导致资源短缺和缓冲不足的异常。或者,我们可以使
用Custom ThreadPool策略调用CallerRunsPolicy。在这个案例中也一样,一个线程挂起
可能导致所有线程最后都被挂起。(主线程绝不能成为caller,因为任何发送到主线程的认
为都可能被挂起从而导致一切任务都停滞。)
那么,使用什么方案才合适呢?推荐一个不算简单的ThreadPoo模式,这个模式根据任
务进度和挂起的线程数调整线程池的大小。首先,让我们看一下检测挂起线程中会遇到的问
题。
检测挂起线程
图一是这个模式的抽象示意图:
这里有两个重要的类:ThreadManager和ManageThread。这两个类都由Java Thread
类扩展而来。ThreadManager掌握着装有ManagedThreads的容器。当心的ManageThread创
建后,它就会把自己添加到这个容器中。
ThreadHangTester testthread = new
ThreadHangTester(threadhangertest,2000,false);
testthread.start();
thrdManger.manage(testthread, ThreadManager.RESTART_THREAD, 10);
thrdManger.start();
ThreadManager会在列表中重复出现,并调用ManagedThread’sisHung() 方法。这基
本上利用的是时间戳核对逻辑。
if(System.currentTimeMillis() - lastprocessingtime.get()
maxprocessingtime )
{
logger.debug(Thread is hung);
return true;
}
如果它发现线程进入到任务循环且再也不进行更新,它就会采用ManageThread规定的
恢复机制。
while(isRunning)
{
for (Iterator iterator = managedThreads.iterator(); iterator.hasNext();) {
ManagedThreadData thrddata = (ManagedThreadData) iterator.next();
if(thrddata.getManagedThread().isHung())
{
logger.warn(Thread Hang detected for ThreadName= +
thrddata.getManagedThread().getName() );
switch (thrddata.getManagedAction())
{
case RESTART_THREAD: // T
您可能关注的文档
- 基于 SOPC实时说话人识别控制器 刘好新指导老师:张歆奕 - A.pdf
- 2014届新课标高考总复习·化学 节末归纳整合3无机物间的特殊转化关系.ppt
- 大学英语口语测试的实证考察和分析.pdf
- 道路建设标准.doc
- M1与M2型巨噬细胞表型的比较分析.pdf
- 删除字符串中指定字符.docx
- 第5篇 应用支撑层.pptx
- 存储过程在WEB 中调用.doc
- C# - 序列化与反序列化.doc
- 第三章进程的同步及通信.ppt
- 职业技术学院2024级工业机器人技术(安装与维护)专业人才培养方案.docx
- 职业技术学院2024级应用化工技术专业人才培养方案.pdf
- 职业技术学院2024级软件技术(前端开发)专业人才培养方案.pdf
- 职业技术学院2024软件技术专业人才培养方案.docx
- 职业技术学院2024级信息安全技术应用(安全运维)专业人才培养方案.docx
- 职业技术学院2024级新能源汽车检测与维修技术(车辆鉴定与评估)专业人才培养方案.pdf
- 职业技术学院2024级石油炼制技术专业人才培养方案.pdf
- 职业技术学院2024级环境监测技术专业人才培养方案.docx
- 职业技术学院2024级汽车制造与试验技术专业人才培养方案.pdf
- 职业技术学院2024级信息安全技术应用专业人才培养方案.pdf
文档评论(0)