翻译作者:boool
原文出处:http://www.onjava.com/pub/a/onjava/2003/10/08/multithreaded_xml.html
在b2b(企业对企业)应用中xml扮演一个重要的角色。在这些应用中采用simple api for xml (sax)或者document object model (dom)解析器来解析xml文件。(这两个解析器都是java的api,他们可以在下面的附录中找到)在一个单线程应用中解析是简单明了的。但是,在多线程的应用中这就是很复杂和具有挑战性了,比如说做一个应用服务器,因为应用经常会为解析xml创建一个专门的线程,解析的数据用来为许多同时并发运行的线程服务。这篇文章描述了一个在并发应用中的xml的解析实现。
设计方法
基于并发的生产和消费设计概念,一个专门的线程作为一个生产者去解析xml。一组线程作为消费者,作为解析xml数据的生产线程,他把数据存储在一个共享的数据结构中以供消费线程在将来进行处理时取得,为了最大化产生数据的能力同时最小化内存的使用,这个设计使用了一个特别的队列来分别为生产者、消费者存储和找到解析的数据.
巧妙的队列(smart queuing)
smartqueue 队列类提供给生产消费线程们队列的功能,他主要的责任是维护队列防止(线程)超载和断流。换句话说,smartqueue采用维护一个固定长度的队列的方法去保持资源的应用效率。他挂起和唤醒适当的线程在适当的时候,打个比方,如果没有填充数据的空间,队列将挂起生产线程直到一个消费线程从队列里移去一项。
下面的smartqueue 代码片断展示了这种策略的实现。
public synchronized void put(object data) {
// check to see if the length is 2
while (list.size() >= 2) {
try {
system.out.println("waiting to put data");
wait();
}
catch (exception ex) {
}
}
list.add(data);
notifyall();
}
public synchronized object take() {
// wait until there is data to get
// come out if the end of file signaled
while (list.size() <= 0 && (eof != true)) {
try {
system.out.println("waiting to consume data");
wait();
} catch (exception ex) {
}
}
object obj = null;
if (list.size() > 0) {
obj = list.remove(0);
} else {
system.out.println("woke up because end of document");
}
notifyall();
return obj;
}public void startelement( string namespaceuri, string localname,
string qname, attributes atts )
throws saxexception {
system.out.println(
" startelement local names............." +
localname + " " + qname);
if (qname.equalsignorecase(elemmark)) {
doc = new hashtable();
}
elem = qname;
}
public void endelement( string namespaceuri, string localname,
string qname )
throws saxexception {
string s = sbdata.tostring();
system.out.println("element " + elem + " character " + s);
if ((doc != null) & (s != null) & !(s.trim().equals("")))
doc.put(elem, s);
sbdata = new stringbuffer();
system.out.println(" endelement ending element............." + qname);
if (qname.equalsignorecase(elemmark)) {
system.out.println(
" endelement ending element............." + localname);
smartqueue.put(doc);
doc = null;
}
}
public void enddocument() throws saxexception {
smartqueue.end();
system.out.println("end document.............");
}public void run() {
while (!queue.isempty() !queue.onend()) {
hashtable val = (hashtable) queue.take();
system.out.println("obtained by " + this.getname() + " " + val);
// try {
// system.out.println("simulate lengthy
processing...........");
// thread.sleep(2000);
// }
// catch(exception ex){}
}
}Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器