GenericObjectPoolからオブジェクトを借用するためにポーリングするループがあります。プール自体のサイズは1です。以下のコード-
final CompletionService completionService = new ExecutorCompletionService(getExecutorServices());
int counter = 0;
for (Iterator iter = AList.iterator(); iter.hasNext();) {
borrowed = this.getPool().borrowObject();
if (borrowed == null) {
throw new Exception("not set");
} else {
completionService.submit(borrowed,borrowed);
counter ++;
}
}
プールのサイズは1であるため、最初の借用後、プールは使い果たされてブロックされます。オブジェクトをプールに戻すには、次のように別のスレッドを実行すると思います-
new Runnable() {
public void run() {
for (int i = 0; i < counter; i++) {
borrowed = completionService.take().get();
status = borrowed.getStatus();
getPool().returnObject(borrowed);
counter --;
if (status = 1) {
getExecutorServices().shutdownNow();
return;
}
}
}
};
これは、各スレッドの完了に基づいて動作し、スレッドを解放して借用できるようにするためのCompletionServiceへのブロッキング呼び出しです。
ただし、この設計には、親のカウンターがRunnableから読み取れないなどの欠点があります。