快速业务通道

Java理论与实践: 嗨,我的线程到哪里去了? - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
自 己有能力防止一个编写得较差的插件破坏整个服务器。适当的纠正操作应该将错 误记录到日志,然后,简单地转到下一条消息,终止当前线程并重新启动它(这 是类似于 TimerTask 的类的做法),或者卸载引起问题的插件,如清单 2 中所 示:

清单 2. 防备 RuntimeException 的工作线程

private class SaferPoolWorker extends Thread {    public void run() {      IncomingResponse ir;      while (true) {        ir = (IncomingResponse) queue.getNext();        PlugIn plugIn = findPlugIn(ir.getResponseId());        if (plugIn != null) {      try {            plugIn.handleMessage(ir.getResponse());          }          catch (RuntimeException e) {            // Take some sort of action;            // - log the exception and move on            // - log the exception and restart the worker thread            // - log the exception and unload the offending plug-in          }        }        else          log("Unknown plug-in for response " + ir.getResponseId());      }    } }

Java理论与实践: 嗨,我的线程到哪里去了?(3)

时间:2010-12-21 IBM Brian Goetz

使用由 ThreadGroup 提供的未捕获的异常处理程序

除了将外来代码视作较可能抛出 RuntimeException 的方法之外,使用 ThreadGroup 类的 uncaughtException 函数也是明智的。 ThreadGroup 用处不 很大,但是目前(直到 JDK 1.5 中的 Thread 添加了未捕获的异常处理为止) , uncaughtException 特性暂时使它不可或缺。清单 3 展示了一个示例,使用 ThreadGroup 来检测由于未捕获的异常引起的线程死亡。

清单 3. 使用 uncaughtException 来检测线程死亡

public class ThreadGroupExample {    public static class MyThreadGroup extends ThreadGroup {      public MyThreadGroup(String s) {        super(s);      }      public void uncaughtException(Thread thread, Throwable throwable) {        System.out.println("Thread " + thread.getName()         + " died, exception was: ");        throwable.printStackTrace();      }    }    public static ThreadGroup workerThreads =     new MyThreadGroup("Worker Threads");    public static class WorkerThread extends Thread {      public WorkerThread(String s) {        super(workerThreads, s);      }      public void run() {        throw new RuntimeException();      }    }    public static void main(String[] args) {      Thread t = new WorkerThread("Worker Thread");      t.start();    } }

如果线程组中的一个线程因抛出一个未捕获的异常而死亡,则调用该线程组 的 uncaughtException() 方法,该方法可以向日志写入一条记录、重新启动线 程,然后重新启动系统,或采取它认为必要的任何纠正或诊断操作。至少,如果 在线程死亡时所有线程都写一条日志消息,您将有一个何时、何处出错的记录, 而不是只能奇怪您的请求处理线程到哪里去了。

结束语

当线程从应用程序中消失时会引起混乱,并且在很多情况下,线程消失时没 有(堆栈)跟踪。象对付许多风险一样,防止线程泄漏的最佳方法是预防和检测 相结合;注意有可能抛出

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号