异步下载 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。
希望对您有所帮助。
我必须根据 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。
希望对您有所帮助。