0

THereは、GenericObjectPoolからオブジェクトを借用し、各ループでエグゼキューターに送信するループです。次に、呼び出し元はすべての実行者が完了するのを待つ必要があります。

これが現在のコードです-

private ImplClass implObject;
private Future future;

for (Iterator iter = anArrayList.iterator(); iter.hasNext();) {

    //Gets a GenericObjectPool Object
    implObject = (ImplClass) this.getImplPool().borrowObject();

    future = getExecutorServices().submit(implObject);
}


// Wait for Exectuor to complete
while (!future.isDone()) {
    try {
        Thread.sleep(Global.WaitTime());

    } catch (InterruptedException iex) {
    }
}

しかし、futureは最後のスレッドのみを待機するため、これは間違っています。各エグゼキュータを監視するために先物の配列を作成する必要がありますか?

4

2 に答える 2

1

これはどう?:

List<Callable> tasks = new ArrayList<Callable>();
for (Iterator iter = anArrayList.iterator(); iter.hasNext();) {
    //Gets a GenericObjectPool Object
    implObject = (ImplClass) this.getImplPool().borrowObject();      
    tasks.add(implObject);
}
List<Future<Object>> futures = getExecutorServices().invokeAll(tasks);
于 2013-02-20T15:11:40.280 に答える
1

ExecutorService には、そのための特定のメソッドがあります: ExecutorService.invokeAll(tasks)

Ralfの回答に記載されているExecutorCompletionServiceも役立ちます。結果が到着したときに呼び出し元スレッドで結果を処理できます。

于 2013-02-20T15:17:42.843 に答える