【发布时间】:2009-07-19 14:55:41
【问题描述】:
我有一个方法可以接受一系列查询,我需要针对不同的搜索引擎 Web API(例如 Google 或 Yahoo's)运行它们。为了使进程并行化,为每个查询生成一个线程,然后在最后joined,因为我的应用程序只能在之后继续我得到每个的结果/em> 查询。我目前有这些方面的东西:
public abstract class class Query extends Thread {
private String query;
public abstract Result[] querySearchEngine();
@Override
public void run() {
Result[] results = querySearchEngine(query);
Querier.addResults(results);
}
}
public class GoogleQuery extends Query {
public Result querySearchEngine(String query) {
// access google rest API
}
}
public class Querier {
/* Every class that implements Query fills this array */
private static ArrayList<Result> aggregatedResults;
public static void addResults(Result[]) { // add to aggregatedResults }
public static Result[] queryAll(Query[] queries) {
/* for each thread, start it, to aggregate results */
for (Query query : queries) {
query.start();
}
for (Query query : queries) {
query.join();
}
return aggregatedResults;
}
}
最近,我发现Java 中有一个新的 API 用于执行并发作业。即Callable接口,FutureTask和ExecutorService。我想知道这个新 API 是否应该使用,以及它们是否比传统的 Runnable 和 Thread 更有效。
在研究了这个新的 API 之后,我想出了以下代码(简化版):
public abstract class Query implements Callable<Result[]> {
private final String query; // gets set in the constructor
public abstract Result[] querySearchEngine();
@Override
public Result[] call() {
return querySearchEngine(query);
}
}
public class Querier {
private ArrayList<Result> aggregatedResults;
public Result[] queryAll(Query[] queries) {
List<Future<Result[]>> futures = new ArrayList<Future<Result[]>>(queries.length);
final ExecutorService service = Executors.newFixedThreadPool(queries.length);
for (Query query : queries) {
futures.add(service.submit(query));
}
for (Future<Result[]> future : futures) {
aggregatedResults.add(future.get()); // get() is somewhat similar to join?
}
return aggregatedResults;
}
}
我是这个并发 API 的新手,我想知道在上面的代码中是否有可以改进的地方,以及它是否比第一个选项更好(使用 @987654330 @)。有些课程我没有探索,例如FutureTask,等等。我也很想听听这方面的任何建议。
【问题讨论】:
-
对我来说看起来不错,不确定我会在您的第二个示例中进行任何更改。在您的第一个示例中,我将扩展 Runnable 而不是 Thread,但这只是挑剔。
-
+1,对我来说已经足够了。
标签: java multithreading concurrency search-engine future