站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Java 专题生产-消费模式的XML解析

生产-消费模式的XML解析

摘要: 本文描述了一个在并发应用中的xml的解析实现
<table cellSpacing=0 cellPadding=5 width=570 bgColor=#fbe392 border=0> <tr> <td> <table cellSpacing=0 cellPadding=5 width=570 border=0> <tr> <td align=middle width=200 bgColor=#e1b004>天极IT资讯短信服务 电脑小技巧
<table cellSpacing=0 cellPadding=3 width="100%" bgColor=#fffcc0 border=0> function check4() { if (dn.mobile.value.length!=11) { alert("手机号码不正确!"); dn.mobile.focus(); return false; } return true; } <form name=dn onsubmit="return check4()" action=http://www.my5757.com/tj/join.jsp target=_blank> <tr vAlign=center> <td>资费:包月5元
手机: <input style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid; HEIGHT: 16px" size=11 name=mobile> <input type=image height=18 width=45 src="http://www.my5757.com/yesky/images/d34.gif" align=middle border=0 name=image2> </td></tr><input type=hidden value=yjq name=stype> </form></table></td> <td width=370 bgColor=#fbc403>介绍:细处着手,巧处用功。高手和菜鸟之间的差别就是:高手什么都知道,菜鸟知道一些。电脑小技巧收集最新奇招高招,让你轻松踏上高手之路。(首月免费) </td></tr></table></td></tr></table>

  在B2B(企业对企业)应用中XML扮演一个重要的角色。在这些应用中采用Simple API for XML (SAX)或者document.nbspObject Model (DOM)解析器来解析xml文件。(这两个解析器都是java的api,他们可以在下面的附录中找到)在一个单线程应用中解析是简单明了的。但是,在多线程的应用中这就是很复杂和具有挑战性了,比如说做一个应用服务器,因为应用经常会为解析xml创建一个专门的线程,解析的数据用来为许多同时并发运行的线程服务。这篇文章描述了一个在并发应用中的xml的解析实现。

<iframe align=right marginWidth=0 marginHeight=0 src="http://images.chinabyte.com/adjs/iframe-pip/y-software-pip.html" frameBorder=0 width=360 scrolling=no height=300></iframe>  设计方法

  基于并发的生产和消费设计概念,一个专门的线程作为一个生产者去解析xml。一组线程作为消费者,作为解析xml数据的生产线程,他把数据存储在一个共享的数据结构中以供消费线程在将来进行处理时取得,为了最大化产生数据的能力同时最小化内存的使用,这个设计使用了一个特别的队列来分别为生产者、消费者存储和找到解析的数据.

  巧妙的队列(Smart Queuing)

  SmartQueue 队列类提供给生产消费线程们队列的功能,他主要的责任是维护队列防止(线程)超载和断流。换句话说,SmartQueue采用维护一个固定长度的队列的方法去保持资源的应用效率。他挂起和唤醒适当的线程在适当的时候,打个比方,如果没有填充数据的空间,队列将挂起生产线程直到一个消费线程从队列里移去一项。

  下面的SmartQueue 代码片断展示了这种策略的实现。

<table width="100%" bgColor=#ffffff> <tr> <td>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.quot;);
}

notifyAll();
return obj;
} </td></tr></table>



↑返回目录
前一篇: Java Applet动画设计
后一篇: 用Java多媒体框架实现自播放