クエリの配列を受け取るメソッドがあり、それらを Google や Yahoo などのさまざまな検索エンジン Web API に対して実行する必要があります。プロセスを並列化するために、クエリごとにスレッドが生成され、最後にスレッドが生成されます。これは、すべてのクエリの結果が得られた後join
にのみアプリケーションを続行できるためです。私は現在、これらの行に沿って何かを持っています:
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;
}
}
最近、並行ジョブを実行するための新しいAPI が Java にあることを発見しました。つまり、Callable
インターフェイス、FutureTask
およびExecutorService
. この新しい API を使用する必要があるかどうか、また従来の 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 を初めて使用します。上記のコードで改善できる点があるかどうか、および最初のオプション (を使用) よりも優れているかどうかを知りたいThread
です。など、私が調べていないクラスがいくつかありますFutureTask
。その辺のアドバイスも頂ければ幸いです。