有一个循环轮询从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读取父计数器。
最佳答案
计数器不是线程安全的。使用AtomicInteger并使它可用于可运行代码块和第一个代码块。