诊断Java代码:孤线程(Orphaned Thread)错误情势[Java编程]
本文“诊断Java代码:孤线程(Orphaned Thread)错误情势[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
在多线程代码中,利用驱动别的线程所负责的行动的单个主线程是常见的.这个主线程发送消息,普通是通过把它们放到一个行列中,然后别的线程处理这些消息.但是假如主线程抛出一个非常,那么剩余的线程会持续运行,等候更多输入到该行列,招致程序冻结.在诊断 Java 代码的这一部份中,专职 Java 开辟者兼兼职捉虫者 Eric Allen 谈论检测、修复和避免这一错误情势.
用多线程编写代码对程序员大有好处.多线程能使编程(和程序)举行得快得多,并且代码能有效得多地利用资源.但是,跟生活中的很多事情一样,多线程也存在缺陷.因为多线程代码天生是非肯定性的,呈现错误的大概性大得多.并且,确切发生的的错误很难重现,因此也更难办理.
孤线程情势
Java 编程语言为多线程代码供应了丰富的支持,包含一项分外有效的功效:可以在一个线程中抛出一个非常而不影响别的线程.但这项功效会招致很多难以跟踪的错误.
从某个线程的崩溃中恢复过来是有意义,在此种情形下,这种本领能增添程序的结实性级别.但是,它也使我们难以判断这些线程之一在什么时刻抛出了一个非常.因为剩余的线程将持续运行,所以程序会表现出无呼应或冻结程序的征象.对线程之间频繁通信的程序而言特别如此.
考虑清单 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代码:孤线程(Orphaned Thread)错误情势[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |