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

异步下载xml页面并用Java编写文件?,java,file,asynchronous,io,download,Java,File,Asynchronous,Io,Download,我必须根据id列表(500万id)加载数据 我想从所有这些id下载一个页面,然后将其写入一个文件。有没有办法下载它们并以异步模式写入文件?我已经同步完成了,但需要更多的时间 这是我的代码: while ((sCurrentId = inputFile.readLine()) != null) { counterLine++; WikiLine wikiLine=download(sCurrentId,counterLine); if(wikiLine!=null)

我必须根据id列表(500万id)加载数据

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

这是我的代码:

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

救命

您可以使用Excutor同时启动多个任务,并使用单独的线程处理所有任务。
您定义了一个可调用的类来读取输入文件,然后使用执行器的
提交(可调用)
方法为您的ID提交任务。查看。

您可以让一个线程读取所有行并将它们添加到队列中,另一个线程可以从队列中读取所有行并将其写入文件,可能类似于以下内容:

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();
final SynchronousQueue wikiLines=new SynchronousQueue();
Thread fetchXmlThread=新线程(()->{
而((sCurrentId=inputFile.readLine())!=null){
counterLine++;
WikiLine WikiLine=下载(sCurrentId,counterLine);
if(wikiLine!=null)
wikiLine.put(wikiLine.toString());
}
});
Thread writeToFileThread=新线程(()->{
对于(;;){
append(wikiLines.take());
}
});
fetchXmlThread.start();
writeToFileThread.start();
请注意,即使在fetchXmlThread关闭之后,writeToFileThread仍将继续阻塞,因此您应该实现一些东西来停止该线程。这可以通过在线程阻塞时中断线程(由于
wikiLines.take()
)或通过某种可以检查是否有剩余行以及另一个线程是否仍在运行的方法来更改(;;))的

如果您确实需要2个以上的线程,那么您可能需要进行研究


希望这有帮助。

谢谢,我与遗嘱执行人解决了这个问题。但是你的解决方案也很棒!谢谢