快速业务通道

当主线程崩溃而其它线程继续运行时发生什么 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-25
种崩溃的一个辅助手段是捕捉由各种线程抛出的异常并在退出之前通知该问题的依赖线程。这正是我在清单 2 中所做的。

清单 2. 把错误通知给客户机线程的示例

import java.util.Vector; public class Server2 extends Thread { Client2 client; int counter; public Server2(Client2 _client) { this.client = _client; this.counter = 0; } public void run() { try { while (counter < 10) { this.client.queue.addElement(new Integer(counter)); counter++; } throw new RuntimeException("counter >= 10"); } catch (Exception e) { this.client.interruptFlag = true; throw new RuntimeException(e.toString()); } } public static void main(String[] args) { Client2 c = new Client2(); Server2 s = new Server2(c); c.start(); s.start(); } } class Client2 extends Thread { Vector queue; boolean interruptFlag; public Client2() { this.queue = new Vector(); this.interruptFlag = false; } public void run() { while (! interruptFlag) { if (! (queue.size() == 0)) { processNextElement(); } } // Processes whatever elements remain on the queue before exiting. while (! (queue.size() == 0)) { processNextElement(); } System.out.flush(); } private void processNextElement() { Object next = queue.elementAt(0); queue.removeElementAt(0); System.out.println(next); } }

处理被抛出的异常的其它选项可能是调用 System.exit。这个选项在程序的主线程发生崩溃而其它线程不管理任何临界资源的时候是有意义的。然而在其它情况下,这可能是危险的。例如,考虑这样一个示例,其它线程中的一个正在管理一个打开的文件。如果这是实际的情况,那么只是退出程序会导致资源泄漏。

即使在上面的简单示例中,在 server 线程中调用 System.exit 也会导致 client 未处理其队列上的任何剩余元素就退出。

事实上,就是这样的问题促使 Sun 不建议线程的 stop 方法。由于强行停止一个线程会使资源陷入非一致状态,所以 stop 方法破坏了语言的安全性模型。

想了解 Sun 的更多不建议理由,请参阅参考资料。

当主线程崩溃而其它线程继续运行时发生什么(3)

时间:2009-10-10 Eric Allen

总结

这里是本周错误模式的总结:

模式:孤线程

症状:一个锁定多线程程序,它具有或不具有将堆栈跟踪打印到标准错误。

致因:多个程序线程一直等待来自某个线程的输入,而该线程在抛出一个未被捕捉的异常后就退出了。

治疗和预防措施:把异常处理代码放到主线程中以在崩溃来临之际通知依赖线程。

参考资料

参加本文的讨论论坛。

阅读关于为什么不建议 Thread.stop 的 Sun 的解释。

Neel V. Kumar 在他的文章“Java 程序中的多线程”(developerWorks,2000 年 3 月)中提供调试多线程 Java 的途径。

Peter Haggar 的“优化 Java 编程中的并发”(IBM PartnerWorld for Developers)是一份优秀的白皮书,它讨论通过执行多线程来并发存取数据会导致的常见问题。

想获得编写多线程 Java 程序的介绍,请参阅 Alex Roetter 的文章“编写多线程 Java 应用程序”(developerWorks,2001 年 2 月)。

想为您的 Java 应用程序中的多线程问题获得技术帮助,请访问多线程 Java 编程讨论论坛。

Brian Goetz 在他共三部分的系列轻松使用线程中处理困难的线程问题。

JUnit 主页提供讨论程序测试方法的很多有趣文章的链接,并提供 JUnit 的最新版本。

利用 Java 调试教程(developerWorks,2001 年 2 月),获取通用调试技术的帮助。

阅读 Eric 所有诊断 Java 代码的文章,其中多

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号