java – 使用ExecutorService并行处理作业

我正在编写一个需要处理大量URL的java程序.
每个URL将按顺序运行以下作业:下载,分析,压缩

我希望每个作业都有一个固定数量的线程,而不是让每个URL一次完成所有作业,所以所有作业都会在任何给定时间同时运行并发线程.

例如,下载作业将有多个线程来获取和下载URL,只要下载其中一个URL,它就会将其传递给analyze作业中的一个线程,一旦完成,它将传递给压缩作业中的线程等

我正在考虑在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,这是一个可行的方法吗?如果没有,是否有更好的替代方法来解决这个问题?请提供示例.

解决方法:

一旦提到IN ORDER,任何尝试为顺序任务使用单独的线程只会使系统的设计复杂化.

在我看来,最好的方法是让单独的线程同时处理各个URL.要执行3个步骤,您可以引入另一个抽象(例如使用3个callables),但您仍然希望在一个线程中按顺序执行它们.而且不需要完成服务.

上一篇:java中ExecutorService使用多线程处理业务


下一篇:java – 如何在所有线程完成执行后退出ExecutorService?