我需要從rss提要每5分鐘更新一次新聞提要。在這種情況下,我是否需要每次創建DocumentBuilderFactory?
爲此,我寫了一個TimerTask如下圖所示
public class TimerTaskForAllNews
{
public static void main(String[] args)
{
TimerTask task = new AllNewsUpdatrUtility();
Timer timer = new Timer();
timer.schedule(task, 1000,60000);
}
}
這是我的TimerTask實現類
package com.util;
import java.net.URL;
public class AllNewsUpdatrUtility extends TimerTask {
private static AllNewsUpdatrUtility instance = null;
public AllNewsUpdatrUtility() {}
public static AllNewsUpdatrUtility getInstance() {
if (instance == null)
instance = new AllNewsUpdatrUtility();
return instance;
}
@Override
public void run() {
try {
JSONArray latestnews = new JSONArray();
JSONObject jsonobj_allnews = new JSONObject();
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
URL url = new URL("http://www.rssmix.com/u/8160628/rss.xml");
Document doc = builder.parse(url.openStream());
NodeList items = doc.getElementsByTagName("item");
for (int i = 0; i < items.getLength(); i++) {
Element item = (Element) items.item(i);
String title = getValue(item, "title");
String link = getValue(item, "link");
String pub_date = getValue(item, "pubDate");
} // for loop ends here
} catch (Exception e) {
e.printStackTrace();
}
}
}
能否請你讓我知道,我反正可以改進這個方案?
DBF IST不是線程安全的。如果你可以保證它只被一個線程使用,你可以緩存它。 – qqilihq
但newDocumentBuilder()應該是線程安全的:https://jaxp.java.net/docs/spec/html/#plugabililty-thread-safety。因此,可以一勞永逸地創建一個DBF,並從多個線程中重用它來創建文檔構建器。 –
那又如何? newDocumentBuilder()不是一個setter方法。它不配置工廠。因此,您可以創建一個工廠並從** one **線程配置它,然後發佈它,以便任何線程可以同時調用其newDocumentBuilder()方法,因爲newDocumentBuilder()是線程安全的。 –