2013-12-15 39 views
0

我正在使用Java的基於多線程的Web應用程序。Java多線程網絡抓取工具,可以在每秒鐘連續提取數據的同時允許用戶檢索數據

我在該應用程序中有兩個線程,一個Web Scraper和一個線程來執行一些計算(類似於生產者和消費者)。 Scraper不斷從第三方API(每秒更新的世界人口)讀取數據。另一個線程(消費者)不斷嘗試從刮取器檢索數據並計算每分鐘內最快的更改率。

我的問題是,刮刀需要每秒鐘不斷提取數據。當消費者檢索數據時,它需要鎖定記錄數據的碎片變量(例如,緩衝區)。但是,這可能會阻止刮板持續每秒鐘記錄數據。有沒有一種方法可以讓消費者在不停止提取數據的情況下獲取數據而不會阻止每一秒?

+0

聽起來像你可能想要[Circular Buffer](http://www.codeproject.com/Articles/2880/Circular-Buffer)。 –

+0

將刮取的數據複製到新的數據結構並返回給用戶。這樣用戶就可以在請求時訪問數據,而且刮板仍然可以檢索新數據。 –

+0

你想每秒鐘獲得世界人口的最新情況,並發現人口增長最快的時候呢?這是一個相當harebrained計劃國際海事組織。每當有人在蒙古的一個村莊出生時,你認爲在0.1秒內就會通知一些中央當局?無論您使用何種數據源,本質上都是對人口進行線性估計。觀察到的增長率的唯一變化將由四捨五入誤差和網絡中各種延遲引起,而不是人口增長的實際變化。 –

回答

0

查看BlockingQueue Java文檔。實現是線程安全的,因此您的生產者和消費者線程可以安全地與隊列中的eacher進行通信。 如果您在向客戶交付刮刀結果時擔心「錯過了一次敲擊」,那麼每秒鐘都要啓動一個新的刮刀線程。然後,如果一個刮刀線程在交付結果時必須等待,它不會影響其他線程的刮擦。如果抓取結果結構是時間戳的,則可以處理消費者級別上可能出現的亂序消息。或者使用PriorityQueue在隊列級別上。但是PriorityQueue並不是線程安全的。