当主线程崩溃而别的线程持续运行时发生什么[Java编程]
本文“当主线程崩溃而别的线程持续运行时发生什么[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
孤线程情势
症状
医治和预防办法
总结
参考资料
关于作者
对本文的评价
当主线程崩溃而别的线程持续运行时发生什么?
Eric E. Allen(eallen@cs.rice.edu)
博士研究生候选人,Rice 大学
2001 年 8 月
在多线程代码中,利用驱动别的线程所负责的行动的单个主线程是常见的.这个主线程发送消息,普通是通过把它们放到一个行列中,然后别的线程处理这些消息.但是假如主线程抛出一个非常,那么剩余的线程会持续运行,等候更多输入到该行列,招致程序冻结.在诊断 Java 代码的这一部份中,专职 Java 开辟者兼兼职捉虫者 Eric Allen 谈论检测、修复和避免这一错误情势.请在谈论论坛与作者和其他读者同享您关于本文的心得.
用多线程编写代码对程序员大有好处.多线程能使编程(和程序)举行得快得多,并且代码能有效得多地利用资源.但是,跟生活中的很多事情一样,多线程也存在缺陷.因为多线程代码天生是非肯定性的,呈现错误的大概性大得多.并且,确切发生的的错误很难重现,因此也更难办理.
孤线程情势
Java 编程语言为多线程代码供应了丰富的支持,包含一项分外有效的功效:可以在一个线程中抛出一个非常而不影响别的线程.但这项功效会招致很多难以跟踪的错误.
快速跟踪代码
清单 1.
一个线程之间频繁通信的示例程序
清单 2.
演示若何捕捉非常并在退出之前告诉问题的依靠线程.
从某个线程的崩溃中恢复过来是有意义,在此种情形下,这种本领能增添程序的结实性级别.但是,它也使我们难以判断这些线程之一在什么时刻抛出了一个非常.因为剩余的线程将持续运行,所以程序会表现出无呼应或冻结程序的征象.对线程之间频繁通信的程序而言特别如此.
考虑清单 1 所示的示例,此中的一对线程通过生产者-消费者模子举行通信.
清单 1. 一个简单的、多线程的消费者-生产者程序
public class Server extends Thread {
Client client;
int counter;
public Server(Client _client) {
this.client = _client;
this.counter = 0;
}
public void run() {
while (counter < 10) {
this.client.queue.addElement(new Integer(counter));
counter++;
}
throw new RuntimeException("counter >= 10");
}
public static void main(String[] args) {
Client c = new Client();
Server s = new Server(c);
c.start();
s.start();
}
}
class Client extends Thread {
Vector queue;
public Client() {
this.queue = new Vector();
}
public void run() {
while (true) {
if (! (queue.size() == 0)) {
processNextElement();
}
}
}
private void processNextElement() {
Object next = queue.elementAt(0);
queue.removeElementAt(0);
System.out.println(next);
}
}
在诸如这样的案例中,第二个线程接纳用于计算的任何数据完好依靠于第一个线程.因此,不可避免地,假如第一个线程崩溃(而在这个样本中,必定是这样的),那么第二个线程将等候永久不会到来的更多输入.目前您知道我为什么把这种错误叫做孤线程情势.
症状
这种错误情势最常见的症状是我在前面提到的 ? 即,程序好象冻结了.
别的症状大概包含打印到程序尺度错误和尺度输出的仓库跟踪实际终止了.
以上是“当主线程崩溃而别的线程持续运行时发生什么[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |