异步下载 xml 页面并用 Java 写入文件?

Download xml page asynccronosly and write on a file in Java?

我必须根据 ID 列表(5 百万个 ID)下载数据。

我想从所有这个id下载一个页面,然后写在一个文件上。有没有办法下载它们并以异步模式写入文件?我已经同步完成了,但是需要很多时间。

这是我的同步代码:

 while ((sCurrentId = inputFile.readLine()) != null) {
     counterLine++;
     WikiLine wikiLine=download(sCurrentId,counterLine);
     if(wikiLine!=null)
          outputFile.append(wikiLine.toString());
 }

求助!!

您可以使用 Excutor 同时启动多个任务,并使用单独的线程处理所有任务。 您定义一个 Callable class 来读取输入文件,然后使用 Executor[=17] 的 submit(Callable) 方法为您的 ID 提交任务=].看看 ExecutorService.

您可以让一个线程读取所有行并将它们添加到队列中,然后另一个线程可以从队列中读取所有行并将其写入文件,也许是这样的:

final SynchronousQueue<String> wikiLines = new SynchronousQueue<>();

Thread fetchXmlThread = new Thread(() -> {
    while ((sCurrentId = inputFile.readLine()) != null) {
        counterLine++;
        WikiLine wikiLine = download(sCurrentId,counterLine);
        if (wikiLine != null)
             wikiLines.put(wikiLine.toString());
    }
});

Thread writeToFileThread = new Thread(() -> {
    for(;;) {
        outputFile.append(wikiLines.take());
    }
});

fetchXmlThread.start();
writeToFileThread.start();

请注意,即使在 fetchXmlThread 关闭后,writeToFileThread 仍将继续阻塞,因此您应该执行一些操作以停止该线程。这可以通过在线程阻塞时中断线程(由于 wikiLines.take())或更改 for(;;) 来检查是否还有任何行以及另一个线程是否仍然 运行 来完成].

如果您确实需要 2 个以上的线程,您可能需要查看 executors

希望对您有所帮助。