我正在编写一个需要处理大量 URL 的 java 程序。
每个 URL 将按顺序运行以下作业:下载、分析、压缩
我希望每个作业都有固定数量的线程,而不是让一个线程在每个 URL 上一次完成所有作业,以便所有作业在任何给定时间都有线程同时运行。
例如,下载作业将有多个线程来获取和下载 URL,一旦下载了其中一个 URL,它就会将其传递给分析作业中的线程,一旦完成,它就会传递给压缩作业中的线程等。
我正在考虑在 java 中使用 CompletionService,因为它会在完成后立即返回结果,但我不确定它是如何工作的,到目前为止我的代码如下所示:
ExecutorService executor = Executors.newFixedThreadPool(3);
CompletionService<DownloadedItem> completionService = new ExecutorCompletionService<DownloadedItem>(executor);
//while list has URL do {
executor.submit(new DownloadJob(list.getNextURL());//submit to queue for download
//}
//while there is URL left do {
Future<DownloadedItem> downloadedItem = executor.take();//take the result as soon as it finish
//what to do here??
//}
我的问题是如何将下载的项目移动到分析作业并在那里完成工作而无需等待所有下载作业完成?我正在考虑为每个工作创建一个 CompletionService,这是一种可行的方法吗?如果没有,是否有更好的替代方法来解决这个问题?请提供例子。