亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

一個生產-消費模式的XML解析實現

2019-11-18 12:49:43
字體:
來源:轉載
供稿:網友

  在B2B(企業對企業)應用中xml扮演一個重要的角色。在這些應用中采用Simple API for XML (SAX)或者document.nbspObject 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.        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;
  }
  
  xml 解析
  這個設計使用SAX API來解析XML文件是有以下原因的:
  這個API讀取 XML數據是快速高效的,他不構造任何內部的XML數據描述,相應的,他在碰到XML元素時簡單的把數據傳遞給應用程序。SAX API十分適合生產-消費模式.
  xml 解析控制器(XMLParserHandler) 的類繼續自SAX,實現回叫(callback )方法從解析器中接收XML數據,當解析控制器類從解析器中接收XML數據時,他把數據put進hashtable里。在每個文檔的結尾,解析控制器把數據put進SmartQueue隊列里。這個控制器將進入一個等待狀態假如SmartQueue隊列里有空間,一旦消費線程從SmartQueue隊列中移去一項,put方法將被調用。在完成整個XML文檔的解析后,解析控制器(
  XMLParserHandler)通知消費線程停止搜索更多的文檔。
  
  讓我們看看回叫(callback )方法,他把數據存儲入SmartQueue隊列然后通知等待的消費線程。起始元素(startElement)方法為每個XML文件中的每個文擋元素示例一個新的Hashtable。
  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;
  }
  
  結尾元素(endElement)方法負責把解析的數據加到SmartQueue隊列中。就象前面提起的,SmartQueue隊列掛起這個線程直到沒有空間來存儲數據。
  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;
    }
  }
  
  最終,結尾文檔元素(enddocument.nbsp)回叫方法通知消費線程到達了xml文檔的結尾。這意味著消費線程不用去等待其他數據完成他們的工作。
  public void enddocument.) throws SAXException {
    smartQueue.end();
    System.out.println("End document.............");
  }
  
  消費線程
  消費線程移從SmartQueue隊列中除項目一旦生產線程把項目放入SmartQueue隊列。假如SmartQueue隊列為空,每個消費線程將要進入等待狀態。消費線程會一直運行直到生產線程通知已經達到了文檔元素的結尾而且SmartQueue隊列中再沒有項目了。這里有一個消費線程的例子實現,他保持不斷地從SmartQueue隊列中取數據直到隊列中沒有數據或者達到了文檔元素的末尾。
  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){}
    }
  }
  
  優點
  這個設計有以下優點:
  解析和數據消費可以并發的進行。大的xml文件只用很少的內存就能被解析
  
  設計的擴展
  SmartQueue隊列執行固定長度隊列的策略來維護內存的效率。改變它的T?。╰ake)和存(put)方法,你能執行一個不同的策略。在前面提到的,xml解析控制器(XMLParserHandler)產生一個xml元素和值的hashtable。然而,這個類可以被定制去建立應用指定的對象。
  
  例子程序
  source.z
ip文件包括一個TestProdUCerConsumerForXML類可以把xml文件作為一個參數運行。根據下面的說明來運行程序,
  Unzip the source.zip file.
  Run the program TestProducerConsumerForXML with order.xml.
  For example
  
  c:/testarea>java -classpath c:/testarea prodcons.TestProducerConsumerForXML c:/testarea/prodcons/order.xml
  這篇文章用一些程序描述了解析xml文檔元素的方法,也解釋了一些關于生產和消費模式的概念,還有和線程的應用。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
一区二区国产精品视频| 欧美日韩亚洲系列| 国产精品视频xxxx| 日韩精品福利在线| 大桥未久av一区二区三区| 一区二区三区精品99久久| 国产精品99一区| 亚洲精品永久免费| 欧美日韩性视频在线| 91精品国产高清久久久久久久久| 亚洲欧美另类国产| 中文字幕欧美精品日韩中文字幕| 日韩高清av在线| 国产成人久久久精品一区| xx视频.9999.com| 日本久久久久久久| 成人黄色免费片| 欧美在线亚洲在线| 欧美精品在线视频观看| 色噜噜狠狠色综合网图区| 伊人久久男人天堂| 国产精品第七十二页| 亚洲美女在线看| 538国产精品一区二区在线| 亚洲高清在线观看| 欧美大码xxxx| 国产精品美乳一区二区免费| 日韩欧美aaa| 国产精品一区二区3区| 成人精品aaaa网站| 亚洲va久久久噜噜噜| 国产亚洲欧洲在线| 欧美国产日韩一区二区三区| 日韩av在线网站| 97超级碰在线看视频免费在线看| 性色av一区二区三区红粉影视| 1769国内精品视频在线播放| 欧美激情视频网| 精品久久久一区二区| 亚洲天堂一区二区三区| 日韩精品高清在线观看| 欧美超级免费视 在线| 欧美日韩综合视频网址| 欧美有码在线视频| 久久精品一偷一偷国产| 日本电影亚洲天堂| 亚洲福利视频在线| 久久精品视频亚洲| 51久久精品夜色国产麻豆| 国产美女精品视频| 国产亚洲精品久久| 北条麻妃在线一区二区| 色综合亚洲精品激情狠狠| 欧美色另类天堂2015| 国产精品免费久久久| 国产欧亚日韩视频| 九九精品在线播放| 成人国产精品日本在线| 欧美精品videosex极品1| 久久久999国产精品| 久久久999国产| www.99久久热国产日韩欧美.com| 亚洲国产精品久久久久秋霞蜜臀| 国产ts人妖一区二区三区| 在线视频亚洲欧美| 91久久精品国产91久久性色| 国产精品国产福利国产秒拍| 国内精品视频一区| 韩国国内大量揄拍精品视频| 91啪国产在线| 日韩专区中文字幕| 夜夜嗨av一区二区三区免费区| 日韩中文字幕在线视频| 韩日欧美一区二区| 久久人人爽亚洲精品天堂| 亚洲日本成人网| 中国人与牲禽动交精品| 久久中文久久字幕| 免费成人高清视频| 亚洲激情视频在线观看| 亚洲最新中文字幕| 欧美国产高跟鞋裸体秀xxxhd| 欧美性受xxxx白人性爽| 日韩亚洲欧美中文在线| 欧美在线观看日本一区| 日韩不卡在线观看| 亚洲国产高潮在线观看| 欧美日韩激情视频8区| 欧美精品成人91久久久久久久| 欧美性猛交xxxx免费看久久久| 亚洲人成欧美中文字幕| 久久天天躁狠狠躁夜夜躁| 欧美日韩国产一区在线| 日韩大片免费观看视频播放| 日本午夜精品理论片a级appf发布| 日韩美女视频中文字幕| 国产一区二区丝袜| 欧美成人精品在线播放| 欧美成人免费在线视频| 久久香蕉国产线看观看av| 中文欧美日本在线资源| 亚洲欧美一区二区精品久久久| 欧美性69xxxx肥| 欧美精品午夜视频| 精品久久久久久亚洲国产300| 日本亚洲欧洲色α| 日韩激情第一页| 欧美一级大胆视频| 亚洲欧美精品一区| 亚洲午夜国产成人av电影男同| 欧美做受高潮电影o| 国产美女久久久| 亚洲激情免费观看| 亚洲成人av在线播放| 日韩欧美主播在线| 91成人在线观看国产| 国产精品久久久av久久久| 91亚洲国产成人久久精品网站| 亚洲精品91美女久久久久久久| 久久精品91久久久久久再现| 91av在线播放| 中文字幕久热精品在线视频| 日本久久亚洲电影| 亚洲丁香久久久| 欧美综合一区第一页| 神马国产精品影院av| 91免费视频网站| 久久天天躁夜夜躁狠狠躁2022| 97视频人免费观看| 亚洲第一区第一页| 久久久久久这里只有精品| 色一区av在线| 日韩精品中文字幕久久臀| 久久在线观看视频| 日本久久久久久久| 欧美精品久久久久久久| 在线视频国产日韩| 久久久久久久爱| 中文字幕精品网| 成人在线视频福利| 国产精品久久久久久亚洲调教| 亚洲aⅴ日韩av电影在线观看| 成人黄色av播放免费| 国产精品美女主播| 日韩欧美国产视频| 欧美午夜无遮挡| 日韩精品在线免费观看视频| 国产精品一区二区电影| 久久久久久久久久久亚洲| 日韩在线观看免费高清完整版| 久久影视电视剧免费网站| 国产亚洲激情视频在线| 精品精品国产国产自在线| 久久精品视频在线播放| 91精品视频在线免费观看| 欧美三级xxx| 亚洲欧洲黄色网| 日本欧美黄网站| 日韩精品免费电影| 国内精品在线一区| 欧美一乱一性一交一视频| 亚洲人成免费电影| 国产精品国模在线| 精品福利樱桃av导航|