网站大量收购独家精品文档,联系QQ:2885784924

Java中挂起线程检测与处理之道.pdf

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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

文档评论(0)

xuefei111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档