java - 在java中并行构造XML元素

标签 java xml multithreading java-8

我有一个对象数组,我正在使用 java 构建一个 xml 文档,如下所示 -

Object[] arr = fetchData();
Document newDoc =DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
Element rootElement = newDoc.createElement("company");
for(int i=0;i<arr.length();i++)
{
    Element staff = new Element("staff");
    staff.setAttribute(new Attribute("id", i));
    staff.addContent(new Element("firstname").setText(arr[i].getFirstName()));
    staff.addContent(new Element("lastname").setText(arr[i].getLastName()));
    staff.addContent(new Element("nickname").setText(arr[i].getNickName()));
    staff.addContent(new Element("salary").setText(arr[i].getSalary()));
    ............
    ............
    ............
    ............
    ............
    rootElement.appendChild(staff);
}
newDoc.appendChild(rootElement);

生成的 xml 将具有以下形式 -

<company>
  <staff id="1">
    <firstname>Foo</firstname>
    <lastname>Bar</lastname>
    <nickname>FB</nickname>
    <salary>999999</salary>
............
............
............
............
  </staff>
  ......
  ......
</company>

上述解决方案适用于小型数组,但当数组大小增加时,由于上述代码的顺序处理,需要很长时间才能处理。有什么方法可以通过使用 java 8 Stream 并行处理或 java 中的线程来并行处理人员元素的构造?

使用 CompletableFuture 的更新解决方案:

Object[] arr = fetchData();
Document newDoc =DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
Element rootElement = newDoc.createElement("company");
List<CompletableFuture<Element>> futureElements = new ArrayList<>();
for (int x = 0; x < arr.length(); x++) {
    Object e = arr[x];
    CompletableFuture<Element> f = CompletableFuture.supplyAsync(() -> getElement(newDoc, e));
    futureElements.add(f);
}

for (CompletableFuture<Element> e : futureElements)
        rootElement.appendChild(e.get());

newDoc.appendChild(rootElement); 

最佳答案

您可以使用的是 CompletableFuture

这样你就可以在一个新线程中生成所有的“staff”元素,然后等待它们全部完成并添加它们

List<CompletableFuture<Element>> futureElements = new ArrayList<>()
for(int x = 0; x < arr.length; x++){
     //getElement(arr[x]) is the get staff element logic
     CompletableFuture<Element> f = CompletableFuture.supplyAsync(() -> getElement(arr[x]))
     futureElements.add(f);
}

CompletableFuture<Void> allOf = CompletableFuture.allOf(futureElements.toArray(new CompletableFuture[0]))

现在您可以修改 allOf CompletableFuture,或者您可以使用诸如 thenAccept() 之类的东西来创建一个新线程,该线程将在所有其他线程完成后立即启动,或者执行 .get() 以连接回主线程。

如果你执行 .get() 那么你可以做类似的事情

futureElements.forEach(f -> rootElement.append(f.get()));

关于java - 在java中并行构造XML元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43230763/

相关文章:

java - 创建动态加载类的另一个实例 - Java

java - 扫描仪 next() 为某些在线编译器抛出 NoSuchElementException

java - 在 JPBC 中将元素从 G1 映射到 Zn

xml - 使用 XSLT 1 根据另一个 xml 过滤 XML

java.lang.RuntimeException : Can't create handler inside thread that has not called Looper. 准备()

java - 如果不中断,Future.cancel() 会做什么?

java - 关于 Hibernate 中 Clob 对象的问题

xml - 用于 XML 数字签名的命令行工具

c# - 使用 C# 和 Linq 动态生成 kml 文件

android - 线程和处理程序的区别